我有一个使用 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
最佳答案
鉴于您有 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。模型。P.S.:上述解决方案的灵感来自 https://stackoverflow.com/a/8844932/3770684
关于ruby-on-rails - 如何使用外键定义 activerecord 和 activeresource 之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24259346/