2014-09-04 81 views
0

我試圖在rails中創建父/子關係關聯,但我不太確定如何執行此操作。Ruby on Rails ActiveRecord:使用連接在同一模型中創建父/子關係

我有兩個表格,產品和products_products。這兩個表格讓我有產品和子產品。

products 
----------- 
id | title | ... 

products_products 
----------------- 
id | product_id | parent_product_id | ... 

我想要做的是獲得產品的所有兒童產品。

所以我必須:

class Product < ActiveRecord::Base 
    ... 
    has_many :products_products 
    has_many :child_products, through: :products_products, source: :product 
    has_many :parent_products, through: :products_products, source: :parent_product 
    ... 
end 

class ProductsProduct < ActiveRecord::Base 
    .... 
    belongs_to :product 
    belongs_to :parent_product, class_name: "Product", foreign_key: "parent_product_id" 
    .... 
end 

的parent_products協會的工作,但我不知道如何讓child_products。

的SQL是:

SELECT "products".* 
FROM "products" 
INNER JOIN "products_products" ON "products"."id" = "products_products"."product_id" 
WHERE "products_products"."parent_product_id" = <myProductd> 

的目標是要能說myProduct.child_products得到的子產品的列表。

+0

對於從業務邏輯的角度來看,你有什麼想做的事情,我有點困惑。儘管我會說product_products是一張桌子的糟糕名字。我也錯過了爲parent_products和child_products定義表的位置。你能否給出一個你想要完成的更詳細的例子? – 2014-09-04 19:40:46

+0

基本上,我試圖創建一個自引用連接,以便產品可以有子產品。即產品#1可以是產品#2,產品#3等的父母。任何產品可以是任何其他產品的父母。我需要一種方式來獲取產品的所有孩子或產品的所有父母的清單。 products_products表只是保存這些關係的連接表。 – 2014-09-04 19:45:31

回答

1

你需要的是一個自我指涉協會。

更改應用程序/模型/ product.rb到:

class Product < ActiveRecord::Base 
    has_many :product_mappings 
    has_many :child_products, :through => :product_mappings 
    has_many :inverse_product_mappings, :class_name => "ProductMapping", :foreign_key => "child_product_id" 
    has_many :inverse_child_products, :through => :inverse_product_mappings, :source => :product 
end 

和應用程序/模型/ product_mapping.rb:

class ProductMapping < ActiveRecord::Base 
    # has product_id, child_product_id 
    belongs_to :product 
    belongs_to :child_product, :class_name => "Product" 
end 

來吧,試試吧:

product = Product.find 1 
product.child_products 

欲瞭解更多信息,Ryan bates在Self-Referential Association上進行了精彩的截屏。

+0

謝謝。我不得不保留表結構和類名,因爲它是一個傳統的數據庫/應用程序,但你指出了我正確的方向。 – 2014-09-04 21:29:43

相關問題