Rails: запрос ActiveRecord на основе значения ассоциации

У меня есть 2 модели. Report и Server, которые имеют отношения belongs_to и has_many. Я создал метод доступа с помощью delegate, который позволяет Report найти связанный с ним Server.company_id. Теперь я хочу запустить запрос на Report, который позволяет мне найти все Report, которые связаны с конкретным Server, который имеет конкретный атрибут company_id из 5.

Вот мои две модели. И да, я знаю, что текущий запрос не работает, поскольку Report не имеет атрибута company_id.

И нет, я не хочу хранить company_id внутри Report, поскольку эта информация не принадлежит Report.

Отчет

class Report < ActiveRecord::Base

 belongs_to :server

 delegate :company_id, :to => :server

    class << self

        def method(url, base_url)
            #Report.where(company_id: 5)
        end
    end

end

Сервер

class Server < ActiveRecord::Base

 attr_accessible :company_id

 has_many :reports

end

Ответ 1

Вы можете сделать такой запрос:

Report.joins(:server).where(:servers => {:company_id => 5})

Для меня это более чистое решение для сырого SQL.

Ответ 2

Я использую Rails 4.1.7, и принятый ответ не сработал у меня. Что сделало работу

Report.joins(:server).where(:servers => {:company_id => 5})

Обратите внимание, что разница заключается в том, что ключ в предложении where плюрализован (: серверы вместо: сервер)

Ответ 3

Это должно сделать трюк

Report.joins(:server).where('servers.company_id = ?', 5)

вы также можете добавить область для этого, например,

scope :with_company_id, lambda {|id| joins(:server).where('servers.company_id = ?', id) }

а затем напишите

Report.with_company_id(5)

Ответ 4

Server.where(company_id: 5).first.reports