ruby-on-rails - references - rails has_one through
Rieles-Relación HABTM-¿Cómo puedo encontrar un registro basado en un atributo del modelo asociado? (2)
He configurado esta relación HABTM en el pasado y ha funcionado antes ... Ahora no lo es y estoy en mi mejor momento tratando de averiguar qué está mal. He mirado a través de las guías de rieles todo el día y parece que no puedo entender qué estoy haciendo mal, por lo que la ayuda sería realmente apreciada.
Tengo 2 modelos conectados a través de un modelo de unión y estoy tratando de encontrar registros basados en un atributo del modelo asociado.
Evento.rb
has_and_belongs_to_many :interests
Interés.rb
has_and_belongs_to_many :events
y una migración de tabla de unión que se creó como
create_table ''events_interests'', :id => false do |t|
t.column :event_id, :integer
t.column :interest_id, :integer
end
Lo intenté
@events = Event.all(:include => :interest, :conditions => [" interest.id = ?", 4 ] )
Pero obtuve el error "No se encontró la asociación llamada ''interés''; tal vez lo escribiste mal" ... lo cual, por supuesto, no
Lo intenté
@events = Event.interests.find(:all, :conditions => [" interest.id = ?", 4 ] )
pero obtuvo el error "método indefinido` intereses ''para #Clase: 0x4383348 "
¿Cómo puedo encontrar los eventos que tienen un ID de interés de 4 ... Definitivamente me estoy quedando calvo de esta jaja
La respuesta fue de ayuda, 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 consulta generada era bastante larga en mi caso. Para mí, la tabla que era equiparable a la tabla de "intereses" tenía muchas columnas y datos. Para evitar buscar en la tabla el ID coincidente, mi solución se parecía a esto:
@events = Event.all.where(''events.id'' => @interest.events.each(&:id))
Esto me funcionó ya que ya tenía un objeto @interest instanciado con la lista de ID para los eventos. Por supuesto, no estás usando parte de la magia que tienen los rieles. Además, no pude conseguir que tu solución funcionara con "no". Por ejemplo;
@events = Event.includes(:interests).where.not(interests: { id: 4 })
no funcionaría. Volverí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.
Necesitas incluir la tabla de intereses.
@events = Event.all(:include => :interests, :conditions => ["interests.id = ?", 4])
Lo tenías bien en tu publicación, pero no pluralizaste intereses.
Actualizar
Debido a que esta respuesta aún está recibiendo atención, pensé que podría ser una buena idea actualizarla con la sintaxis ActiveRecord::Relation
ya que la forma anterior será obsoleta.
@events = Event.includes(:interests).where(interests: { id: 4 })
o
@events = Event.includes(:interests).where(''interests.id'' => 4)