我在 Rails 中有一个多态表
MetaFieldsData
,它也属于表 MetaFields
class MetaFieldsData < ApplicationRecord
belongs_to :owner, polymorphic: true
belongs_to :meta_field
end
class MetaField < ApplicationRecord
belongs_to :organization
has_many :meta_fields_data
end
连接到多态表的一个模型称为
orders
:
class Order < ApplicationRecord
belongs_to :organization
...
has_many :meta_fields_data, as: :owner
...
owner
是我的协会课程(与官方RoR指南中的
imageable
相同)
现在,当我想在 Order
模型上创建记录时,我看到了一个奇怪的行为:
MetaFieldsData.create(owner: order, meta_field: some_meta_field)
它抛出:
NameError Exception: Rails couldn't find a valid model for MetaFieldsDatum association.
Please provide the :class_name option on the association declaration. If :class_name is already provided, make sure it's an ActiveRecord::Base subclass.
奇怪的是没有类
MetaFieldsDatum
(注意这里的拼写错误,来自Rails)。我搜索了所有代码,其中没有拼写错误,类名定义中也没有。
这使得我无法在此表上创建实际的
MetaFieldsData
,因为 Rails 似乎解释了错误的命名。
这里可能出了什么问题?
我遇到了同样的问题,但我的解决方案不同。
我的
belongs_to
模型中有一个拼写错误,导致模型无效。
我尝试在控制台中访问它,发现它是一个无效模型。因为它无效,Rails 没有加载它,随后也找不到它。
当我更正拼写错误后,错误消失了。
Datum
用作 data
的复数形式。请注意,您有 has_many :meta_fields_data
,如果您想将其更改为单数,它也将是 has_one :meta_fields_data
。
这称为词形变化,它是一种检测单词复数形式的方法,您可以在此处阅读 Rails 的做法 https://api.rubyonrails.org/classes/ActiveSupport/Inflector/Inflections.html
一般来说,您可以简单地遵循错误告诉您的内容并在关系名称中使用
datum
(如果这样做,请指定 class_name),或者定义您自己的变形