2012-04-25 15 views
13

A continuación se muestra una relación entre los Comentarios y un usuario. Cada comentario tiene un usuario, así que estoy compilando una combinación en el siguiente código.Rails 3 Uniones: seleccione solo ciertas columnas

Me preguntaba cómo crear este código para incluir solo columnas específicas en la unión. No necesito toda la información del usuario. Solo el primer nombre Alguna sugerencia.

Código actual:

@comments = Comment.where(:study_id => @study.id).joins(:user) 
+0

¿Su modelo de comentarios no tiene una: asociación de usuarios? ¿Estás tratando de cargar la información del usuario? ¿Qué intenta lograr con una combinación que ActiveRecord aún no le ofrece? – PinnyM

+1

Sí. Estoy tratando de cargar la información. Actualmente, hace un usuario para el usuario para cada comentario. – Kyle

Respuesta

21

Usted podría utilizar algo como esto:

@comments = Comment.joins(:user) 
        .select("comments.*, users.first_name") 
        .where(study_id: @study.id) 
+1

Aquí las uniones se comportarían como unión interna. El uso incluye lo contrario: User.includes (: comentarios) .select (...) –

3

La extensión de la respuesta de Aldo para mostrar una manera de recuperar el valor de la columna externa resultante.

@comments = \ 
    Comment\ 
    .joins(:user) 
    .select("comments.*, users.first_name as users_first_name") 
    .where(study_id: @study.id) 

# Now it's stored on each comment as an attribute, e.g.: 
puts @comments.first.read_attribute(:users_first_name) 
puts @comments.first.attributes['users_first_name'] 

# Note that inspecting the comment won't show the foreign data 
puts @comments.first.inspect # you won't see user's first name output 

También podría declarar users_first_name como attrib en el comentario con attr_accessible. No creo que haya una manera mágica de establecerlo automáticamente, pero podrías hacerlo fácilmente en un ciclo de post-selección.

+1

Hermoso, esto lo hizo – Yarin

+0

Esto funciona. Pero cuidado: cuando inspeccionas el resultado (instancia '@ comments.first.inspect' o '@ comments.inspect'), no verás los datos unidos, y es posible que te lleven a pensar erróneamente que no se puede extraer. Pero cuando especifica el nombre "como", especificado, como en este ejemplo con las "puts", se muestra. – JosephK

+0

Buen punto, añadido al ejemplo – mahemoff

Cuestiones relacionadas