through references rails many has_one has_many has_and_belongs_to_many has foreign example belongs and ruby-on-rails find has-and-belongs-to-many

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)