繁体   English   中英

Rails的多个has_one关联

[英]Rails multiple has_one associations

我有created_by和Modifyed_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。 这种情况下有一个优雅的解决方案吗?

您必须添加的第一件事是可访问属性的规范。 在用户中,您必须添加:

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

首先,根据我的经验,使用外键作为名称进行关联通常是一个坏主意。 尤其是在编写固定装置时,似乎在设置实际值“ 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或类似于外键的名称,只要它不等于关联名称即可。

然后,您的粘贴代码让我有些困惑。 您选择的“交易has_one用户”和“用户属于交易”意味着用户表将具有包含交易ID的created_by和modified_by列(外键),这基本上意味着用户是通过一笔交易创建的吗? 但是,似乎应该由用户创建交易,而不是相反。 您的deal.created_by.email示例完全无法与您的关联一起使用,因为deal不会有一个名为“ created_by”的关联,只有一个“ user”,在单个模型中您可以拥有两个名称相同的关联,首先根本不起作用。

修正与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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM