Ruby on rails 具有多态性和抽象类的Rails关联
这一次真让我抓狂。我正在处理与多个类相关的多态关系,这些类都继承自一个抽象类。这很好,但当我尝试从多态关系访问关联对象时,遇到了一个错误。以下是我的实现:Ruby on rails 具有多态性和抽象类的Rails关联,ruby-on-rails,polymorphic-associations,Ruby On Rails,Polymorphic Associations,这一次真让我抓狂。我正在处理与多个类相关的多态关系,这些类都继承自一个抽象类。这很好,但当我尝试从多态关系访问关联对象时,遇到了一个错误。以下是我的实现: class Foo < ApplicationRecord belongs_to :options, polymorphic: true accepts_nested_attributes_for :options def build_options(params) self.options = options_t
class Foo < ApplicationRecord
belongs_to :options, polymorphic: true
accepts_nested_attributes_for :options
def build_options(params)
self.options = options_type.constantize.new(params)
end
end
module Mod
class Option < ApplicationRecord
self.abstract_class = true
has_one :foo, as: :options
self.table_name_prefix
'foo_'
end
end
class Bar < Options
end
class Baz < Options
end
end
我得到这个错误:
ActiveRecord::AssociationNotFoundError (Association named 'foo' was not found on Foo::Bar; perhaps you misspelled it?)
让我觉得奇怪的是,如果我调用Bar.first.methods
,我会得到:foo
作为一个选项
你知道我需要做什么来修复这个问题,并且仍然使用选项
类继承吗?我知道我可以在子类上定义has_one
,但它适用于Options
的所有子类,如果我能保持关联,我愿意
编辑:情节变厚了!在玩了一会儿之后,我现在意识到有些儿童班的关联是有效的,但有些没有。我似乎也找不到工作的类和不工作的类之间的任何区别 您可能对屈折变化有问题,
属于
应该是一个单数而不是复数(选项
而不是选项
)。对于相同,有一个:foo,as::options
要更改为as::option
table\u name\u前缀在这里是不必要的,在STI中,所有类将共享同一个表
此代码未向我显示问题:
#app/models/foo.rb
类Foo
您可能对屈折变化有问题,属于
应该是一个单数而不是复数(选项
而不是选项
)。对于相同,有一个:foo,as::options
要更改为as::option
table\u name\u前缀在这里是不必要的,在STI中,所有类将共享同一个表
此代码未向我显示问题:
#app/models/foo.rb
类Foo
#/app/models/user.rb
类用户
参考上述示例。#/app/models/user.rb
类用户
请参考上面的示例。是否将您的代码库推送到Github的公共存储库?这是我公司的私有回购,因此很遗憾,我不能。您可以创建一个示例代码库,其中只包含错误消息中的关联模型RED标志:(1)Foo::Bar
。您是否定义了另一个Bar
类?我希望看到Mod::Bar
如所写。(2) 是类选项
还是类选项
?协会暗示它应该是后者。(3) 表格名称前缀是什么?(你是否缺少一个def
?)(4)你说的Bar.first
是指Mod::Bar.first
?我正在尝试最小限度地复制您的代码,并确认,一旦嵌套在模块中,如果没有模块名称空间,我就无法单独引用Bar
。您是否可以将您的代码库推送到Github的公共存储库?这是我公司的私有回购协议,因此我无法,不幸的是,您可以创建一个示例代码库,其中只包含错误消息中的关联模型RED标志:(1)Foo::Bar
。您是否定义了另一个Bar
类?我希望看到Mod::Bar
如所写。(2) 是类选项
还是类选项
?协会暗示它应该是后者。(3) 表格名称前缀是什么?(你是否缺少一个def
?)(4)你说的Bar.first
是指Mod::Bar.first
?我正在尝试最小限度地复制您的代码,并确认,一旦嵌套在模块中,如果没有模块名称空间,我就无法单独引用Bar
。所有子类实际上在DB中都有自己的表,因为每个子类都附加了不同的数据。例如,其中一个包含关于特定时间量的信息,另一个引用来自不同类的特定对象。我明白你说的拐点是什么意思,属于:options
从技术上讲不是正确的拐点。我将把它作为所属的\u to:option
进行尝试,看看这是否有帮助。实际上,所有子类在数据库中都有自己的表,因为每个子类都有不同的附加数据。例如,其中一个包含关于特定时间量的信息,另一个引用来自不同类的特定对象。我明白你关于屈折变化的意思了,属于:options
在技术上并不正确
ActiveRecord::AssociationNotFoundError (Association named 'foo' was not found on Foo::Bar; perhaps you misspelled it?)
# /app/models/user.rb
class User < ActiveRecord::Base
has_one :profile, as: :profileable, dependent: :destroy
end
# /app/models/business.rb
class Business < ActiveRecord::Base
has_one :profile, as: :profileable, dependent: :destroy
end
# /app/models/profile.rb
class Profile < ActiveRecord::Base
belongs_to :profileable, polymorphic: true
end