2011-01-14 7 views
28

He configurado esta relación HABTM en el pasado y funcionó antes ... Ahora no está y estoy en mi ingenio Terminar tratando de descubrir cuál es incorrecto. He mirado a través de las guías de los carriles todo el día y no puedo entender lo que estoy haciendo mal, por lo que la ayuda sería realmente apreciada.Rails - Relación HABTM - ¿Cómo puedo encontrar un registro basado en un atributo del modelo asociado

Tengo 2 modelos conectados a través de un modelo de combinación y estoy tratando de encontrar registros basados ​​en un atributo del modelo asociado.

Event.rb

has_and_belongs_to_many :interests 

Interest.rb

has_and_belongs_to_many :events 

y unirse a la migración tabla creada como

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

Probé

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

Pero recibí el error "Asociación llamada 'interés' no se encontró; tal vez mal escrito que "... lo que no me gustó por supuesto

Probé

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

pero tengo el error" método no definido `intereses de #Class: 0x4383348"

¿Cómo puedo encontrar los eventos que tienen un id de interés del 4 .... definitivamente voy calva de esta lol

Respuesta

67

es necesario incluir la tabla intereses.

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

Has acertado en tu publicación, pero no has pluralizado tus intereses.

actualización

Debido a esta respuesta todavía está recibiendo atención, pensé que podría ser una buena idea para actualizarlo usando ActiveRecord::Relation sintaxis ya la forma anterior va a ser obsoleta.

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

o

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

La respuesta fue muy útil, gracias! Sé que esta publicación es antigua, pero se me ocurrió una solución diferente que podría ser útil para alguien. Noté que la generación de consultas fue bastante larga en mi caso. Para mí, la tabla que era equivalente a su tabla de "intereses" tenía muchas columnas y datos. Para evitar la búsqueda de que la mesa para la Identificación del juego, mi solución parecía similar a esto:

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

Esto funcionó para mí ya que ya tenía un objeto instanciado @interest con la lista de los ID de los eventos. Por supuesto, no estás usando parte de la magia que tienen los rieles. Además, no pude lograr que tu solución funcione con "no". Por ejemplo;

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

no funcionaría. Devolvería 0 resultados.Pero esto:

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

funcionaría, lo que devolvería todos los eventos que no tienen una asociación con @interest.

Cuestiones relacionadas