我正在通过两个模型之间的关系来处理一个简单的has_many。
成就模型描述了一个可以由Professional :: Company通过ConqueredAchievement表征服的成就,该表保存了征服时间。
当我跨命名空间工作时,我知道在创建关系时必须提供完整的类名,但是它似乎没有任何作用,因为无论是否传递值,它都会引发完全相同的错误。班级名称。
这是模型的代码:
class Achievement < ApplicationRecord
has_many :conquered_achievements
end
class Professional::Company < ApplicationRecord
has_many :conquered_achievements
has_many :achievements, through: :conquered_achievements
end
class ConqueredAchievement < ApplicationRecord
belongs_to :achievement
belongs_to :professional_company, class_name: 'Professional::Company'
end
当我尝试创建关联时,请使用:
c.conquered_achievements.create!(achievement: a)
我得到了错误(ConqueredAchievement模型上有class_name和没有class_name的相同错误):
ActiveModel::UnknownAttributeError (unknown attribute 'company_id' for ConqueredAchievement.)
在生成的表上,该行实际上被命名为professional_company_id。
我已经看到很多关于has_many的抱怨,因为它们不能在命名空间之间正常工作。我是在做错什么,还是实际上是一个错误?
答案 0 :(得分:0)
尝试:
class Professional::Company < ApplicationRecord
has_many :conquered_achievements, foreign_key: :professional_company_id
has_many :achievements, through: :conquered_achievements
end
线索出在错误中:
ActiveModel::UnknownAttributeError (unknown attribute 'company_id' for ConqueredAchievement.)
该协会正尝试在company_id
上使用名为ConqueredAchievement
的属性来找到Professional::Company
。但是,正如您所说,该属性不存在。
您可以使用foreign_key:
选项(如docs第4.3.2.6节中所述来指定外键,而不是让rails尝试推断外键)。