0

次のことを考慮してください

class Engineer < ActiveRecord::Base
  has_many :ideas
  scope :masters, -> { where(educational_level: ["master", "candidate"]) }
end

class Idea < ActiveRecord::Base
  belongs_to :engineer
  scope :popular, -> { where("rating > ?", 4) }
end

ここで、マスター エンジニアによって考案され、エンジニアのage. age簡単にするために、これはテーブル内の単なる整数列であると仮定しengineersます。

これを行う 1 つの方法は、最初にエンジニアを取得することです。

popular_ideas_by_educated_engineers = []
Engineer.masters.order("age").each do |engineer|
  popular_ideas_by_educated_engineers += engineer.ideas.popular
end

このコードには n+1 の問題があります。これは、アイデアが積極的にロードされておらず、全体的にぎこちなく感じられるためです。

次のように記述して、目的の結果が得られるようにコードを記述したいと思います。

Idea.popular.by_masters.order_by_engineer_age

これは可能ですか?

Idea結合していくつかの制限を課すクラスにSQLをハードコードできることはわかっていますengineersが、私が探しているのは、Engineerクラスですでに定義されているスコープを利用することです。

4

2 に答える 2

0

ここで結合とマージを使用できます。

class Engineer < ActiveRecord::Base
  scope :masters, -> { where(educational_level: ["master", "candidate"]) }
  scope :ordered_by_age, -> { order(:age) } 
end

class Idea < ActiveRecord::Base
  belongs_to :engineer

  scope :popular, -> { where("rating > ?", 4) }
  scope :by_master, -> { joins(:engineer).merge(Engineer.masters) }
  scope :order_by_engineer_age, -> { joins(:engineer).merge(Engineer.order_by_age) }
end
于 2013-10-15T21:52:49.110 に答える