Many-to-Many Verband Um gleiches Modell mit Active?
-
06-07-2019 - |
Frage
Ich folge diesem Tutorial die vortrefflich für has_many funktioniert: durch Beziehungen. Ich habe ganz normale Dinge wie category_product arbeiten.
Aber ich bin nicht in der Lage, diese Situation konzeptionieren (noch damit es funktioniert): Ich habe eine Kategorie, die Kategorien bezogen hat. Da jede Kategorie kann N Kategorien hat ... zunächst einmal, das ist eigentlich eine many-to-many-Situation (ich bin ziemlich positiv, dass es ist)? Zweitens, was würde das aussehen? Meine Migration sieht wie folgt aus:
create_table :categories do |t|
t.string :name
t.timestamps
end
create_table :related_categories, :id => false do |t|
t.integer :category_a_id
t.integer :category_b_id
end
und mein Modell Eingeweide sind
has_many :related_categories, :foreign_key=>"category_a_id"
has_many :categories, :through => :related_categories, :source=>:category_a
Das ist natürlich nicht richtig, obwohl es dort immer (das heißt, es ist 100% gebrochen). Wie kann ich das tun?
Edit: Ich habe vergessen, das, aber nur hier auf SO (was bedeutet, es ist nicht die Antwort):
class RelatedCategory < ActiveRecord::Base
belongs_to :category_a, :class_name=>"Category"
belongs_to :category_b, :class_name=>"Category"
end
Lösung
Sie sollten :source => :category_b
in Ihrer has_many Erklärung versuchen.
Sie haben bereits category_a_id
als Fremdschlüssel für die verbundenen Kategorien Tabelle. Das sagt im Grunde Active das category_a_id
Feld des aktuellen Kategorie Objekt-ID auf der related_categories
Tabelle entsprechen, wenn alle related_categories Aufzeichnungen damit verbundenen holen. Der Quellparameter auf diese has_many :through
Erklärung gibt an, welches Feld sollte für die Suche nach (oder dem Schreiben, was das betrifft) in Betracht gezogen werden, um die damit verbundenen Objekte, wenn die Kategorien Sammlung zu füllen.
Andere Tipps
Hier ist die Antwort, aber es ist nicht schön.
has_many :related_categories, :foreign_key=>"category_a_id"
has_many :related_categories2, :class_name=>"RelatedCategory", :foreign_key=>"category_b_id"
has_many :categories, :through => :related_categories, :source=>:category_b
has_many :categories_backwards, :through => :related_categories2, :source=>:category_a
has_many :category_products
dann würden Sie haben etwas doof Getter zu tun, die die Kategorien + categories_backwards kombiniert, oder so etwas.
Bearbeiten [2 Minuten später]: Wow, mit dem Getter es scheint fast perfekt! Natürlich ist das Problem ist, dass Sie zu den Kategorien zu schieben haben und nicht alles, was Sie von dem Getter erhalten.