【问题标题】:Rails has_many through across workspaces ignores class_nameRails has_many 通过跨工作区忽略 class_name
【发布时间】: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


【解决方案1】:

试试:

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。但是,正如您所说,该属性不存在。

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

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 2013-08-11
    • 2013-08-16
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多