我正在构建一个应用程序来跟踪产品设计,我的关联有些麻烦.基本上我有一个模型(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.