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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top