3

我正在開發一款應用程序以跟蹤產品設計,並且我在協會中遇到了一些麻煩。基本上我有一個模型(大會)需要有多態關聯,但也需要能夠屬於自己。Rails - 多態自加入模型協會

爲了說明,我有三個模型: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'命令的參數。

在此先感謝!

+0

我認爲這基本上是我需要的東西,會產生「多態連接表」。所以它基本上是一個包含三列的連接表:「parent_type」,「parent_id」和「assembly_id」。 「parent_type」可以是「Product」或「Assembly」。 – rjblake1984

回答

0

你可以試試這個

product.rb

class Product < ActiveRecord::Base 
    belongs_to :product_family 
    has_many :assemblies 
end 

assembly.rb

class Assembly < ActiveRecord::Base 
    attr_accessible :top_assembly_id 
    has_many :sub_assemblies, :class_name => "Assembly", :foreign_key => "top_assembly_id" 
    belongs_to :top_assembley, :class_name => "Assembly" 
    has_many :parts 
end 

part.rb

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

,現在你可以引薦

top_assembley.sub_assemblies。創建

+0

不幸的是我使用Rails 4.0.0,所以attr_accessible在我的應用程序中不起作用。我仍然對此感興趣,並且還沒有將自己的頭圍繞在強大的參數上 - 任何想法我可能會對Rails 4進行修改? – rjblake1984

+0

kk我的意思是你應該在你的Assembly模型中有一個名爲'top_assembly_id'的屬性 –

1

我不知道爲什麼這個工作,但我有同樣的問題,解決它:

在大會通過類

has_many :subassemblies, as: :assemblable, class_name: 'Assembly' 

更換

has_many :subassemblies, as: :assemblable 

== ================================================== =================

編輯:soluti的解釋在

前指定:CLASS_NAME:

當調用.subassemblies方法,軌查詢一個假設的「子組件」模型類於該類匹配「assemblable_id」列。然而,'子裝配'模型類沒有定義(無論如何定義它)沒有意義,因此錯誤。

指定後:CLASS_NAME:

因爲類「大會」被指定爲:CLASS_NAME,現在軌道知道它是查詢「大會」模型類和匹配「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. 
1

has_many :subassemblies, as: :assemblable

by

has_many :subassemblies, as: :assemblable, class_name: 'Assembly'

卡洛斯的解決方案的工作,因爲現在軌道知道要查詢的類,如下所示:CLASS_NAME:

致電時

指定之前.subassemblies方法,rails查詢假定的'Subassembly'模型類以匹配t中的'assemblable_id'列帽類。然而,'子裝配'模型類沒有定義(無論如何定義它)沒有意義,因此錯誤。

指定後:CLASS_NAME:

因爲類「大會」被指定爲:CLASS_NAME,現在軌道知道它是查詢「大會」模型類和匹配「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.