我有一个模型,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'
错误。
如果有人知道如何在连接方面声明关联,我会很感激。欢呼声。
答案 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'
因为您无法将它们称为项目。