0
data = Program.joins(:program_schedules, :channel).
        where(
         "program_schedules.start" => options[:time_range], 
           "programs.ptype" => "movie",
            "channels.country" => options[:country]).
      where("programs.official_rating >= ?", options[:min_rating]).
      group("programs.id").
      order("programs.popularity DESC")

このクエリは、「programs」テーブルのみを取得します (「group by」句のためだと思います)。すべてのテーブル (programs、programs_schedules、channel) からすべてのデータを取得するにはどうすればよいですか?

class Program < ActiveRecord::Base

所属先 :チャンネル
has_many :program_schedules

ルビー オン レール 3.2

Postgresql 9.2

4

1 に答える 1

1

メソッドによって提供される関連付けの積極的な読み込みを探していますincludesか?

積極的な読み込みは、特定のクラスのオブジェクトといくつかの名前付きの関連付けを見つける方法です。これは、それぞれが作成者を表示する必要がある100件の投稿をフェッチすると101個のデータベースクエリがトリガーされるという恐ろしい1+Nの問題を防ぐ最も簡単な方法の1つです。積極的な読み込みを使用することで、101クエリを2に減らすことができます。


更新:
クエリ に追加することで、SQLを文字列として取得でき.to_sqlます。.explainも役立ちます。

データをハッシュとして取得し、モデルインスタンスとして取得したくない場合は、クエリの結果をシリアル化し、次を使用して関連付けを含めることができます.serializable_hash

data.serializable_hash(include: [:program_schedules, :channel])

ここで説明されているのと同じ方法で、使用:exceptまたはオプションを含めるフィールドを定義できます(これは同様に機能します): http: //api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json:only.as_json

于 2013-01-10T23:33:18.163 に答える