次のことを考慮してください
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
クラスですでに定義されているスコープを利用することです。