Подтвердить что ты не робот

Rails 3 - выберите с помощью Include?

Вот вложенный выбор с include:

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

Это налоговый запрос, когда он извлекает 1000 строк данных из всех приведенных выше таблиц.

Как я могу получить запрос только для выбора определенных полей?

  • user.name, user.created_at
  • order.created_at
  • supplier.name
  • agent.name
  • manufacturer.name
4b9b3361

Ответ 1

В AREL существует метод select, но вы должны использовать правильные имена таблиц (т.е. множественное число и будьте осторожны, если у вас есть полиморфные модели или если вы используете set_table_name или какую-то другую аналогичную нестандартную практику)

@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)

"Мы можем использовать select с включенными объединениями" - @Bhavesh_A_P

Примечание:

Как указывал выше @Bhavesh_A_P, select с includes не создает согласованного поведения. Похоже, что если включенная ассоциация не возвращает результатов, select будет работать правильно, если она вернет результаты, оператор select не будет иметь никакого эффекта. Фактически, он будет полностью проигнорирован, так что ваш оператор select может ссылаться на недопустимые имена таблиц и не будет выдаваться ошибка. select с joins приведет к согласованному поведению.

Ответ 2

На самом деле мы не можем использовать select with includes. Он может использоваться только с соединениями.

Ответ 3

Проблема не решена путем включения вызова метода "select" в цепочке. В подобной ActiveRecord:: Relation, которую мы построили, вызов "includes", кажется, отменяет любой вызов "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"]) 

Как показано, запрос выбирает все столбцы.

Когда 2 области используют "соединения" вместо "включает", запрос работает: выбираются только 3 указанных столбца.

Ответ 4

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')