我有一个使用activerecord的本地用户模型。用户有一个电子邮件字段。我也有一个称为任务的 Activity 资源模型,该模型具有一个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
最佳答案
假定您在user_id
上具有Task
属性作为外键,或者您可以在User
模型上的关联中指定外键,则您的代码应该可以正常工作:
class User < ActiveRecord::Base
has_many :tasks, foreign_key: "uid"
end
现在的问题是,您不能在
belongs_to
上使用ActiveResource
,因此除非您需要从user
类的实例检索Task
,否则可以将其删除,并且关系的另一端仍然可以使用,但是,如果需要要检索user
,则必须实现自己的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。附注:以上解决方案的灵感来自https://stackoverflow.com/a/8844932/3770684
关于ruby-on-rails - 如何使用外键定义activerecord和activeresource之间的关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24259346/