6

creo que esto es muy básico, pero estoy horrible, con SQL así que no tengo idea de cómo hacerlo ...Rails 3 HABTM encontró por registro asociado atributo model

que tienen una relación HABTM estándar entre dos modelos , LandUse y Foto. Así que tengo una land_uses_photos tabla de unión, y cada modelo tiene la macro estándar, como:

Photo 
has_and_belongs_to_many :land_uses 

La tabla de uso de la tierra tiene: Identificación y Nombre (cadena).

Quiero encontrar fotos donde Nombre del uso del suelo = 'foo', 'bar' o 'baz'. ¿Cómo puedo hacer eso?

Miré a this question y juzgados:

Photo.includes(:land_uses).where('land_use.id'=>[6,7]) 

... pero eso me dio:

ActiveRecord::StatementInvalid: No attribute named `id` exists for table `land_use` 

Eso es falso, aquí está el schema.rb tanto para el uso del suelo y de la tabla de unión:

create_table "land_uses", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "display_order" 
end 

create_table "land_uses_photos", :id => false, :force => true do |t| 
    t.integer "land_use_id" 
    t.integer "photo_id" 
end 

Entonces, ¿cómo hago este tipo de búsqueda? Y para hacer solo una pregunta en lugar de dos, ¿cómo podría encontrar con una condición "y" en lugar de solo una condición "o"?

Gracias!

Respuesta

7
Photo.joins(:land_uses).where('land_uses.name' => ['foo', 'bar', 'baz']) 
+0

Esto lo hizo. ¡Gracias! – Andrew

+0

¿Sabes cuál es la diferencia entre 'join' y' includes'? – Andrew

+2

Use 'includes' cuando desee cargar los datos de la asociación. Esto es útil cuando quiere evitar el problema N + 1. Use 'join' en cualquier otro lugar, ya que genera un sql mucho más simple y rápido. –

1

que generación de un error 'id', ya nombre de tabla es: land_uses y no land_use

+0

Ah, vale, así que ese es el nombre de la tabla, no el nombre del modelo ... sigue aprendiendo, pero esto ayuda, ¡gracias! – Andrew

Cuestiones relacionadas