ruby-on-rails – Rails – 多态自连模型关联

我正在构建一个应用程序来跟踪产品设计,我的关联有些麻烦.基本上我有一个模型(Assembly)需要具有多态关联,但也需要能够属于自己.

为了说明,我有三个模型:Product,Assembly和Part.

>产品可以有多个装配体.
>装配体可以有许多零件和装配体.
>大会属于产品或装配.
>零件属于大会.

我的模型定义目前是这样的:

product.rb

class Product < ActiveRecord::Base
  belongs_to :product_family
  has_many :assemblies, as: :assemblable
end

assembly.rb

class Assembly < ActiveRecord::Base
  belongs_to :assemblable, polymorphic: true
  has_many :parts
  has_many :subassemblies, as: :assemblable
end

part.rb

class Part < ActiveRecord::Base
  belongs_to :assembly
  belongs_to :product_family
end   

我想要做的是,给定一个名为“top_assy”的程序集:

top_assy.subassemblies.create

但是,当我尝试这个时,我收到以下错误:

NameError: uninitialized constant Assembly::Subassembly

我在这里显然做错了什么 – 我错过了什么?我已经尝试将’class_name:“Assembly”’添加为’has_many:subassemblies’命令的参数.

提前致谢!

最佳答案

has_many :subassemblies, as: :assemblable

by

has_many :subassemblies, as: :assemblable, class_name: ‘Assembly’

Carlos的解决方案有效,因为现在rails知道要查询的类,如下所示:

在指定之前:class_name:

在调用.subassemblies方法时,rails会查询假定的“Subassembly”模型类,以匹配该类中的“assemblable_id”列.但是,’Subassembly’模型类没有定义(无论如何定义它都没有意义),因此错误.

指定后:class_name:

因为类’Assembly’被指定为:class_name,所以rails知道它是查询’Assembly’模型类并匹配’assemblable_id’列.

流动的恶化:

# :class_name has been specified to be 'Assembly'
ex_asm = Assembly.new # an example assembly
ex_asm.subassemblies # flow:
    # 1. Rails checks the :subassemblies association
    # 2.a. There it is specified to query the class 'Assembly'
    # 2.b. and it is to match the "id" column of ex_asm
    # 2.c. with the 'assemblable_id' column of the Assembly table
    # 3 Rails returns the assemblies matching criteria (2) as
    #   :subassemblies of ex_asm.
点赞