Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 具有多态性和抽象类的Rails关联_Ruby On Rails_Polymorphic Associations - Fatal编程技术网

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