Rails has_many 通过跨工作区忽略 class_name

Rails has_many through across workspaces ignores class_name

我正在处理一个简单的 has_many 通过 2 个模型之间的关系。

Achievement 模型描述了一个 Professional::Company 可以通过 ConqueredAchievement table 征服的成就,该成就在被征服时保持不变。

当我跨命名空间工作时,我知道在创建关系时我必须提供完整的 class 名称,但它似乎没有任何效果,因为它抛出完全相同的错误或者没有传递给 class_name.

的值

这是模型的代码:

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.)

在生成的 table 上,该行实际命名为 professional_company_id。

我看到很多关于 has_many 无法跨命名空间正常工作的抱怨。我做错了什么,还是这实际上是一个错误?

尝试:

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.)

协会正在尝试使用 ConqueredAchievement 上名为 company_id 的属性来查找 Professional::Company。但是,正如您所说,该属性不存在。

而不是让 rails 尝试推断外键,您可以使用 foreign_key: 选项规定外键,如 docs,第 4.3.2.6 节所述。