Rails ActiveRecord:相同模型之间的两个has_one关系

时间:2014-06-18 08:25:42

标签: ruby-on-rails activerecord

我有一个模型,Project,它有2个关联到同一个模型:

belongs_to :source_connection, class: Connection
belongs_to :destination_connection, class: Connection

工作正常 - 我可以通过项目访问连接方法而没有任何问题。

然而,我对如何进行逆转感到有些困惑。我开始时相当乐观:

has_one :project

在Connection模型上,毫不奇怪,它会抛出一个

ActiveModel::MissingAttributeError: can't write unknown attribute 'connection_id'

当我尝试从连接本身访问项目时出现

错误。

如果有人知道如何在连接方面声明关联,我会很感激。欢呼声。

2 个答案:

答案 0 :(得分:5)

<强>协会

您可能最好查看ActiveRecord关联的foreign_key参数:

#app/models/project.rb
Class Project < ActiveRecord::Base
   belongs_to :source_connection, class: "Connection", foreign_key: "source_connection_id"
   belongs_to :destination_connection, class: "Connection", foreign_key: "destination_connection_id"
end

#app/models/connection.rb
Class Connection < ActiveRecord::Base
   has_many :projects, foreign_key: "source_connection_id"
end

您遇到的问题是,由于您未在关联中使用foreign_key选项,因此Rails将在您的架构中寻找标准foreign_key关联(通常为model_name_id

-

错误

  

无法写入未知属性'connection_id'

我不知道它为什么抱怨,但原因很可能是你没有为你的关联设置正确的外键。通常情况下,Rails会寻找model_name_id - 但由于你不是,你需要在模型中设置相对键(如图所示)

答案 1 :(得分:3)

has_one :project, foreign_key: 'source_connection_id'

Rails正在寻找connection_id,因为你已经使用了source_connection和destination_connection,你需要告诉它使用正确的外键来查找它。

您可能希望将它们定义为:

has_one :source_project, foreign_key: 'source_connection_id'
has_one :destination_project, foreign_key: 'destination_connection_id'

因为您无法将它们称为项目。