2009-06-12 11 views
3

Ich arbeite an einer Rails-App, die ein "Produkt" -Modell hat. Ich möchte Produkte miteinander in Beziehung setzen können. Beispiel: Produkt 1 bezieht sich auf Produkt 2, Produkt 3 und umgekehrt. Wie würde ich dies in Rails erreichen? Ich dachte an einen Join-Tisch, aber da ich die gleiche Tabelle wie den Punkt der Beziehung verwende, bin ich mir nicht sicher, wie das funktionieren würde.Viele-zu-viele-Beziehung mit derselben Tabelle (Ruby on Rails)

Antwort

0

Sie haben Recht, Sie brauchen eine Join-Tabelle. Es benötigt zwei Felder, von denen beide Fremdschlüssel sind, zurück zur Produkttabelle. So etwas wie ProductRelation Tabelle mit FirstProduct und SecondProduct Felder (es gibt wahrscheinlich bessere Namen für diese Felder), dann wissen Sie, dass FirstProduct zu SecondProduct verwandt ist ... dann würden Ihre Abfragen für verwandte Produkte ziemlich einfach sein.

3

Ungeprüfte und aus dem Gedächtnis, ich glaube, Sie so etwas wie dies wünschen würde:

class ProductLink < ActiveRecord::Base 
    belongs_to :parent_product, :class_name => 'Product' 
    belongs_to :child_product, :class_name => 'Product' 
end 

class Product < ActiveRecord::Base 
    has_many :parent_links, :class_name => 'ProductLink', :foreign_key => :parent_product_id 
    has_many :child_links, :class_name => 'ProductLink', :foreign_key => :child_product_id 
end 

product (oder was auch immer Sie wählen, würden es nennen) wäre dann in der Lage sein, ein oder mehr zusätzlichen Felder enthalten, Beschreibe die Beziehung.

Sie können möglicherweise mit has_and_belongs_to_many arbeiten lassen, obwohl ich denke, dass dies eine Tabelle "products_products" erfordern würde, die ein wenig stressig sein könnte.

+0

Aus dem Gedächtnis auch, aber würden Sie nicht has_many verwenden: parent_products,: durch 'product' und has_many: child_products,: durch 'product'? – KaptajnKold

1

Verwenden Sie die acts_as_follower gem. http://github.com/tcocca/acts_as_follower/tree/master. Es ist ziemlich flexibel in Bezug auf die folgenden Beziehungen und bietet eine generische Semantik.

Wirklich einfach und funktioniert sehr gut. Sagen Sie einfach, Produkt 1 folgt Produkt 2/3 usw.

0

ich dies das nützlichste Antwort gefunden: Ruby On Rails - many to many between the same table

Daraus ich erfolgreich ein bidirektionales Viele-zu-Viele-Assoziation eines Modells mit sich selbst. In Ihrem Fall wird es wie folgt sein:

class Product < ActiveRecord::Base 
    ... 

    has_many :parent_product_map, class_name: 'ProductMap', foreign_key: 'child_product_id' 
    has_many :parent_products, through: :parent_product_map, source: :parent_product, class_name: 'Product' 
    has_many :child_product_map, class_name: 'ProductMap', foreign_key: 'parent_product_id' 
    has_many :child_products, through: :child_product_map, source: :child_product, class_name: 'Product' 
    ... 
end 

class ProductMap < ActiveRecord::Base 
    attr_accessible :child_product_id, :id, :parent_product_id 
    belongs_to :child_product, foreign_key: 'child_product_id', class_name: 'Product' 
    belongs_to :parent_product, foreign_key: 'parent_product_id', class_name: 'Product' 
end 

class CreateProductMap < ActiveRecord::Migration 
    def change 
     create_table :product_maps do |t| 
     t.integer :id 
     t.timestamps 
     t.integer :child_product_id 
     t.integer :parent_product_id 
    end 
end