Ответ 1
Вы можете сделать такой запрос:
Report.joins(:server).where(:servers => {:company_id => 5})
Для меня это более чистое решение для сырого SQL.
У меня есть 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
Вы можете сделать такой запрос:
Report.joins(:server).where(:servers => {:company_id => 5})
Для меня это более чистое решение для сырого SQL.
Я использую Rails 4.1.7, и принятый ответ не сработал у меня. Что сделало работу
Report.joins(:server).where(:servers => {:company_id => 5})
Обратите внимание, что разница заключается в том, что ключ в предложении where плюрализован (: серверы вместо: сервер)
Это должно сделать трюк
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)
Server.where(company_id: 5).first.reports