【发布时间】:2018-12-18 17:18:45
【问题描述】:
我正在通过两个模型之间的关系处理一个简单的 has_many。
Achievement 模型描述了可以由 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 的相同错误):
ActiveModel::UnknownAttributeError (unknown attribute 'company_id' for ConqueredAchievement.)
在生成的表上,该行实际上名为professional_company_id。
我已经看到很多关于 has_many 的抱怨,因为它们无法在命名空间之间正常工作。是我做错了什么,还是这实际上是一个错误?
【问题讨论】:
-
您是否尝试过使用
belongs_to :professional_company, class_name: 'Professional::Company', foreign_key: :professional_company_id和/或has_many :conquered_achievements, as: :professional_company? -
即使使用 foreign_key: :professional_company_id,它仍然会抛出完全相同的错误。刚刚尝试为::professional_company,错误更改为:ActiveModel::UnknownAttributeError(ConqueredAchievement 的未知属性'professional_company_type'。)
-
抱歉,动作太快了。
as:用于多态关联。你也可以试试:has_many :conquered_achievements, foreign_key: :professional_company_id. -
成功了。不知道我是怎么想出来的,因为文档似乎只谈论 class_name。非常感谢。
-
超级。添加为答案。请随时为未来的搜索者投票/接受。 (另外,我添加了对文档相关部分的引用。)
标签: ruby-on-rails namespaces has-many