我有多个带有created_by和modified_by列的模型。这就是我对交易模型的看法。
class Deal
has_one :user , :foreign_key => 'created_by'
has_one :user , :foreign_key => 'modified_by'
end
class User
belongs_to :created_by , :class_name => 'Deal' , :foreign_key => 'created_by'
belongs_to :modified_by , :class_name => 'Deal' , :foreign_key => 'modified_by'
end
当我创建交易时,看起来它正确保存。但是在展示视图中,当我尝试获取@deal.created_by.email
时,我收到“未定义的方法email
”错误。有人可以告诉我如何让这个工作吗?
此外,由于我有多个具有这两列的模型,因此User模型中可以有很多belongs_to。这种情况有优雅的解决方案吗?
答案 0 :(得分:4)
您必须添加的第一件事是可访问属性的规范。 在用户中,您必须添加:
attr_accessible :email, :created_by, :modified_by
在交易中:
attr_accessible :created_by, :modified_by
但你也应该改变你的关系方向。 foreign_key总是在belongs_to端。
这对我有用:
class Deal < ActiveRecord::Base
belongs_to :created_by, :class_name => "User", :foreign_key => "created_by"
belongs_to :modified_by, :class_name => "User", :foreign_key =>"modified_by"
attr_accessible :created_by, :modified_by, :name
end
class User < ActiveRecord::Base
has_many :created_deals, :class_name => "Deal", :foreign_key => "created_by"
has_many :modified_deals, :class_name => "Deal", :foreign_key => "modified_by"
attr_accessible :created_deals, :modified_deals, :name
end
如果您有更多看似相似的模型,您可能会使用多态关联:http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
答案 1 :(得分:2)
首先,根据我的经验,使用外键作为名称的关联通常是一个坏主意。特别是在编写fixture时,似乎rails会在设置实际值“created_by”或created_by关联中的模型之间感到困惑。在我的模型中,我通常会将这些关联用于您描述的案例:
belongs_to :creator, :class_name => "User", :foreign_key => 'created_by'
belongs_to :modifier, :class_name => "User", :foreign_key => 'modified_by'
如果您愿意,可以使用“creating_user”等关联名称。如果你真的想要created_by作为关联名称,你应该创建create_by_id或类似外键,只要它不等于关联名称。
然后我对你粘贴的代码感到有点困惑。您选择“Deal has_one User”和“User belongs_to Deal”意味着users表将包含包含Deal Ids的created_by和modified_by(外键)列,基本上意味着用户通过单笔交易创建?然而,似乎交易应该由用户创建,而不是相反。你的deal.created_by.email的例子根本无法与你的关联一起工作,因为交易不会有一个名为“created_by”的关联,只有“user”,你可以在一个模型中有两个同名的关联,一开始根本不工作。
修改你的联想类似于帕特里克建议:
class Deal < ActiveRecord::Base
belongs_to :creator, :class_name => "User", :foreign_key => "created_by"
belongs_to :modifier, :class_name => "User", :foreign_key =>"modified_by"
end
class User < ActiveRecord::Base
has_many :created_deals, :class_name => "Deal", :foreign_key => "created_by"
has_many :modified_deals, :class_name => "Deal", :foreign_key => "modified_by"
end