Rails 3 - выберите с помощью Включить? - PullRequest
37 голосов
/ 29 октября 2010

Вот вложенный выбор с включением:

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

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

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

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

Ответы [ 4 ]

32 голосов
/ 29 октября 2010

В 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 с joins приведет к согласованному поведению.

17 голосов
/ 03 октября 2012

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

5 голосов
/ 12 марта 2011

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

0 голосов
/ 04 декабря 2013
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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...