2011-01-14 20 views
28

Ho impostato questa relazione HABTM in passato e ha funzionato prima .... Ora non lo è e sono al mio ingegno fine cercando di capire cosa non va. Ho guardato attraverso le guide dei binari tutto il giorno e non riesco a capire cosa sto sbagliando, quindi l'aiuto sarebbe davvero apprezzato.Rails - Relazione HABTM - Come posso trovare un record basato su un attributo del modello associato

Ho 2 modelli connessi tramite un modello di join e sto cercando di trovare i record basati su un attributo del modello associato.

Event.rb

has_and_belongs_to_many :interests 

Interest.rb

has_and_belongs_to_many :events 

e un join migrazione tabella creata come

create_table 'events_interests', :id => false do |t| 
     t.column :event_id, :integer 
     t.column :interest_id, :integer 
    end 

Ho provato

@events = Event.all(:include => :interest, :conditions => [" interest.id = ?", 4 ]) 

Ma si è verificato l'errore "Associazione denominata 'interesse' non trovata; forse errata che "... che ho rovinato ovviamente

ho provato

@events = Event.interests.find(:all, :conditions => [" interest.id = ?", 4 ]) 

ma ottenuto l'errore" metodo non definito `interessi dei per #Class: 0x4383348"

Come posso trova gli eventi che hanno un id di interesse del 4 .... sicuramente sto calvo da questo lol

risposta

67

è necessario includere la tabella di interessi.

@events = Event.all(:include => :interests, :conditions => ["interests.id = ?", 4]) 

Hai avuto ragione nel tuo post, ma non hai pluralizzato gli interessi.

Aggiornamento

Perché questa risposta è ancora ricevendo attenzione, ho pensato che potrebbe essere una buona idea per aggiornare utilizzando la sintassi ActiveRecord::Relation dato che il modo di cui sopra sta per essere deprecato.

@events = Event.includes(:interests).where(interests: { id: 4 }) 

o

@events = Event.includes(:interests).where('interests.id' => 4) 
5

La risposta è stata utile, grazie! So che questo post è vecchio, ma ho trovato una soluzione diversa che potrebbe essere utile a qualcuno. Ho notato che la query generate era piuttosto lunga nel mio caso. Per me, il tavolo che era equo alla tua tabella "interessi" conteneva molte colonne e dati. Per evitare la ricerca che tabella per l'id corrispondente, la mia soluzione sembrava simile a questo:

@events = Event.all.where('events.id' => @interest.events.each(&:id)) 

Questo ha funzionato per me da quando avevo già un oggetto @interest istanziato con l'elenco di ID per gli eventi. Ovviamente non stai usando un po 'della magia che i binari sono disponibili. Inoltre, non ho potuto far funzionare la tua soluzione con "not". Per esempio;

@events = Event.includes(:interests).where.not(interests: { id: 4 }) 

non funzionava. Restituirebbe 0 risultati.Ma questo:

@events = Event.all.where.not('events.id' => @interest.events.each(&:id)) 

avrebbe funzionato, che restituirà tutti gli eventi che non hanno un'associazione con @interest.

Problemi correlati