ruby-on-rails – 如何使用外键定义activerecord和activeresourc
发布时间:2020-12-17 03:17:27 所属栏目:百科 来源:网络整理
导读:我有一个使用activerecord的本地用户模型.用户有一个电子邮件字段.我还有一个名为tasks的activeresource模型,它有一个created_by字段,用于存储提交用户的电子邮件地址.我想将这两者联系起来,但我正在努力使用正确的语法,甚至是否可能. ActiveResource的主要
我有一个使用activerecord的本地用户模型.用户有一个电子邮件字段.我还有一个名为tasks的activeresource模型,它有一个created_by字段,用于存储提交用户的电子邮件地址.我想将这两者联系起来,但我正在努力使用正确的语法,甚至是否可能.
ActiveResource的主要分支似乎甚至不支持外键.我找到了alternative branch,但仍然无法正常工作. class User < ActiveRecord::Base has_many :tasks end class Task < ActiveResource::Base belongs_to :user schema do string 'created_by' #email # other fields end end 解决方法
您的代码应该可以正常工作,因为您在Task上有一个user_id属性作为外键,或者您可以在User模型的关联中指定外键,如下所示:
class User < ActiveRecord::Base has_many :tasks,foreign_key: "uid" end 现在问题是,你不能在ActiveResource上使用belongs_to,所以除非你需要从Task类的一个实例中检索用户,你可以删除它,关系的另一面仍然可以工作,但是,如果你需要要检索用户,您必须实现自己的finder方法,如下所示: class Task < ActiveResource::Base schema do string 'created_by' #email # other fields end def user @user ||= User.find self.user_id # use the attribute name that represents the foreign key end def user=(user) @user = user self.update_attribute(:user_id,user.id) end end 这基本上与您在ActiveRecord模型上的预期相同,但是如果您有多个关联,这可能会很烦人,因此您可以扩展ActiveResource模块以添加belongs_to,如下所示: module BelongsToActiveResource def self.included(base) base.extend(ClassMethods) end module ClassMethods def belongs_to( name,options = {} ) class_eval %( def #{name} @#{name} ||= name.to_s.classify.find( name.id ) end def #{name}=(obj) @#{name} ||= obj self.update_attribute((name.to_s + "_id").to_sym,@#{name}.id end ) end end end ActiveResource::Base.class_eval { include BelongsToActiveResource } 这将允许您在任何ActiveResource模型上使用belongs_to. P.S.:上述解决方案的灵感来自https://stackoverflow.com/a/8844932/3770684 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |