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
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.
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.
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.
Probieren Sie das Acts_as_nested-Plugin!
https://github.com/bbommarito/acts_as_nested_set
Vielleicht auch Ryan Bates Screencasts hilft Ihnen:
http://railscasts.com/episodes/163-self-referential-association
Ich glaube, dass die korrekte URL oben sein sollte: http://github.com/rails/acts_as_nested_set – y0mbo
Nein, es sollte https://github.com/bbommarito/acts_as_nested_set sein, korrigiert meinen Beitrag – Lichtamberg
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
- 1. Ruby on Rails Tabelle Beziehung
- 2. Ruby on Rails Join-Tabelle mit Menge
- 3. Historische Tabelle in Ruby on Rails
- 4. Wie andere Tabelle in Ruby on Rails
- 5. SSL mit Ruby on Rails
- 6. Ruby on Rails mit chargify
- 7. Antipatterns mit Ruby on Rails
- 8. Ruby on Rails mit image_tag
- 9. Transaktionsaktion mit Ruby On Rails
- 10. Curl on Ruby on Rails
- 11. Ruby on rails Queing
- 12. Ruby On Rails Application.html.haml
- 13. LocalJumpError (Ruby on Rails)
- 14. Ruby On Rails Grundvariable
- 15. Ruby-on-Rails Authentifizierungsanleitung
- 16. Ruby on Rails Libelle
- 17. ruby-on-rails: gravatar_for
- 18. Ruby on Rails 5.0 Upgrade mit Migration von Benutzern Tabelle
- 19. Ruby on rails Pfadhelfer
- 20. Ruby on Rails Beziehungen
- 21. Feldprüfung Ruby on Rails
- 22. Ruby on rails Verbindungsproblem
- 23. Ruby on Rails Entschlüsselung
- 24. Ruby on Rails Fehler
- 25. Ruby on Rails regex
- 26. Ruby On Rails Migration
- 27. Ruby on Rails bietet
- 28. Ruby on Rails Cache
- 29. Ruby on Rails polymorphe Assoziation
- 30. Ruby on Rails: Dropdown-Menü
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