Domanda

Sto seguendo questo tutorial che sta funzionando magnificamente per has_many: attraverso le relazioni. Ho cose normali come category_product funzionante.

Tuttavia, non sono in grado di concettualizzare questa situazione (né farla funzionare): ho una Categoria con Categorie correlate. Dal momento che ogni categoria può avere N categorie ... prima di tutto, questa è in realtà una situazione molti-a-molti (sono abbastanza sicuro che lo sia)? In secondo luogo, come sarebbe? La mia migrazione è simile al seguente:

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

e le viscere del mio modello sono

has_many :related_categories, :foreign_key=>"category_a_id"
has_many :categories, :through => :related_categories, :source=>:category_a

Questo ovviamente non è giusto, anche se ci sta arrivando (cioè è rotto al 100%). Come posso farlo?

Modifica: ho dimenticato questo, ma solo qui su SO (nel senso che non è la risposta):

class RelatedCategory < ActiveRecord::Base
  belongs_to :category_a, :class_name=>"Category"
  belongs_to :category_b, :class_name=>"Category"
end
È stato utile?

Soluzione

Dovresti provare : source = > : category_b nella tua dichiarazione has_many.

Hai già utilizzato category_a_id come chiave esterna per la tabella delle categorie correlate. Questo in pratica dice ad ActiveRecord di abbinare il campo category_a_id sulla tabella related_categories all'attuale ID oggetto Categoria quando recupera tutti i record relative_categorie ad esso correlati. Il parametro di origine per questa dichiarazione has_many: through specifica quale campo deve essere considerato per trovare (o scrivere, per quella materia) gli oggetti correlati quando si riempie la raccolta di categorie.

Altri suggerimenti

Ecco la risposta, ma non è carina.

  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

allora dovresti fare un po 'getter goofy che combina le categorie + categorie_ indietro, o qualcosa del genere.

Modifica [2 minuti dopo]: Wow, con il getter sembra quasi perfetto! Naturalmente, il problema è che devi spingere verso le categorie e non qualunque cosa tu ottenga dal getter.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top