web-dev-qa-db-ja.com

Rails:関連付けの値に基づくActiveRecordクエリ

2つのモデルがあります。 ReportおよびServerは、belongs_toおよびhas_manyの関係にあります。 delegateが関連するServer.company_idを見つけることを可能にするReportを使用して、アクセサーメソッドを作成しました。ここで、Reportに対してクエリを実行して、特定のcompany_id属性が5である特定のReportに関連付けられているすべてのServerを検索できるようにします。

これが私の2つのモデルです。はい、Reportには属性company_idがないため、現在のクエリは機能しません。

いいえ、company_idReportの内部に保存したくないのは、その情報は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
52
user2158382

次のようなクエリを実行できます。

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

私にとって、これは生のSQLに対するよりクリーンなソリューションです。

77
KappaNossi

私はRails 4.1.7を使用していますが、受け入れられた答えは私にとってはうまくいきませんでした。

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

違いはwhere句のキーが複数形であることに注意してください(:serverではなく:servers)

39
Joseph Gill

これはトリックを行う必要があります

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)
18
Patrick Oscity