Rieles 3: seleccione con Incluir?

Aquí hay una selección anidada con include:

@items = Item.where("complete = ?", true).includes( :manufacturer, {:order=>[:supplier, :agent] }) 

Esta es una consulta impositiva ya que extrae miles de filas de datos de todas las tablas incluidas anteriormente.

¿Cómo puedo obtener la consulta solo para seleccionar campos específicos?

  • user.name, user.created_at
  • order.created_at
  • Nombre del proveedor
  • nombre del agente
  • Nombre del Fabricante

Hay un método de selección en ARel, pero debes usar los nombres de tabla correctos (es decir, plural y ten cuidado si tienes modelos polimórficos o si estás usando set_table_name o alguna otra práctica similar no estándar)

 @items = Item. select('users.name', 'users.created_at', 'orders.created_at', 'suppliers.name', 'agents.name', 'manufacturers.name'). where(:users => { :fulfilled => true }). includes(:orders => [:supplier, :agent], :manufacturer) 

“Podemos usar select con join no incluye” – @Bhavesh_A_P

Nota:

Como @Bhavesh_A_P señaló anteriormente, select con includes no produce un comportamiento consistente. Parece que si la asociación incluida no devuelve resultados, select funcionará correctamente, si devuelve resultados, la instrucción de selección no tendrá efecto. De hecho, se ignorará por completo, de modo que su statement seleccionada podría hacer referencia a los nombres de tabla inválidos y no se produciría ningún error. select with joins producirá un comportamiento consistente.

En realidad, no podemos usar select con includes. Solo se puede usar con combinaciones.

El problema no se resuelve al incluir una llamada al método ‘seleccionar’ en la cadena. En una relación similar ActiveRecord :: Relation que creamos, la llamada ‘includes’ parece anular cualquier llamada a ‘select’.

 scope :active, where("hired_on < ? AND (separated_on > ? OR separated_on IS NULL)", Time.now, Time.now ) scope :with_role, lambda {|roles| includes(:team_member_roles).where(:team_member_roles => {:role => roles } ) } scope :with_site_code, lambda {|site_codes| includes(:team_member_sites).where(:team_member_sites => {:site_code => site_codes } ) } TeamMember.select("team_members.email, team_members.first_name, team_members.last_name").active.with_site_code(params[:site_code]).with_role(["senior_editing", "senior_and_reg_editing"]) 

Como se muestra, la consulta selecciona todas las columnas.

Cuando los 2 ámbitos usan ‘uniones’ en lugar de ‘incluye’, la consulta funciona: solo se seleccionan las 3 columnas especificadas.

 Item.where("fulfilled = ?", true) .includes({:orders =>[:suppliers, :agents]}, :manufacturers) .select("users.name, users.created_at, orders.created_at, suppliers.name, agents.name"). .order('orders.created_at DESC')