Rails has_many在整个工作空间中都会忽略class_name

时间:2018-07-10 19:00:51

标签: ruby-on-rails namespaces has-many

我正在通过两个模型之间的关系来处理一个简单的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的抱怨,因为它们不能在命名空间之间正常工作。我是在做错什么,还是实际上是一个错误?

1 个答案:

答案 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尝试推断外键)。