1

我有多个带有 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”错误。有人能告诉我如何让这个工作吗?

此外,由于我有这两个列的多个模型,因此用户模型中可能有很多 belongs_to。这种情况有一个优雅的解决方案吗?

4

2 回答 2

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

于 2010-10-10T12:19:06.377 回答
2

首先,根据我的经验,使用外键作为名称的关联通常是一个坏主意。特别是在编写固定装置时,似乎 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 作为关联名称,你应该有 created_by_id 或类似外键的东西,只要它不等于关联名称。

然后我对你粘贴的代码有点困惑。您选择“Deal has_one User”和“User belongs_to Deal”意味着用户表将具有包含交易ID的created_by和modified_by(外键)列,基本上意味着用户是由单个交易创建的?然而,似乎交易应该由用户创建,而不是相反。您的 deal.created_by.email 示例根本无法与您的关联一起使用,因为交易不会有一个名为“created_by”的关联,只有“用户”,其中您在一个模型中有两个同名的关联,可以一开始根本不起作用。

修复类似于 Patrick 建议的关联:

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
于 2011-02-12T19:09:57.460 回答