Rails 3, Выбор has_many (левый Join) - PullRequest
2 голосов
/ 07 января 2012

Модели / host.rb

class Host < ActiveRecord::Base
   has_many :report, :dependent => :delete_all
end

Модели / report.rb

class Report < ActiveRecord::Base
   belongs_to :host
end

Теперь я хочу выбрать все хосты с их отчетами, включая хосты, которые не получили никакого отчета.

Я пытался добиться этого с помощью

list=Host.all(:joins => "left join `reports` on reports.host_id=host.id")

но похоже, что Rails только выбирает поля из таблицы hosts. Поэтому я не могу получить доступ к объекту отчета с list[0].report. Кроме того, я был бы намного счастлив сделать выбор без использования сырых команд SQL - в более рубиновой манере.

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

Ответы [ 3 ]

1 голос
/ 07 января 2012

Вы можете сделать

Host.eager_load(:reports)

, который присоединится к таблице отчетов и создаст экземпляры всех объектов отчета.Вы можете использовать загруженные хосты и отчеты точно так же, как если бы они загружались по требованию

0 голосов
/ 08 января 2012

Если вы хотите выбрать поля, отличные от Таблица хостов , вы всегда можете использовать select method для этого.

Host.joins('left join reports on reports.host_id = hosts.id').select('reports.id, reports.column1, reports.column2, hosts.column1') и т. Д. И т. П.

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

0 голосов
/ 07 января 2012

list = Host.joins ("оставлено соединение reports на reports.host_id = host.id")

этот код не создает объекты отчета для вас, только хосты. Но теперь к объектам hosts добавлены временные атрибуты из таблицы отчетов. Вы можете получить к ним доступ

список [0] [: column_name_from_reports_table]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...