2016-11-14 9 views
2

問題

私はhas_manyの-belongs_toの関係を持つ2つのモデルを持っているとしましょう。 has_manyにはスコープが定義され、grade属性にはinteger属性があります。使用範囲 - RubyのRailsの上

class Parent < ApplicationRecord 
    has_many :children 
    scope :great, -> (min_grade) {where("grade > :grade", grade: min_grade)} 
end 

class Child < ApplicationRecord 
    belongs_to :parent 
end 

親モデルのスコープを使用する子モデルでスコープを作成したいとします。

親にスコープの定義を使用することができますか?

現在のソリューション

は、私は今それをやっている方法は、

class Child < ApplicationRecord 
    belongs_to :parent 
    scope :wit_great_parent, -> (min_grade) { 
     join(:parent).where("grade > :grade", grade: min_grade)} 
end 

しかし、私は両方の場所でWHERE句をコピーしています。

質問

は、子モデルから親スコープを呼び出すことがとにかくありますか?

+0

を参照ActiveRecord::SpawnMethods#merge

SELECT * FROM children INNER JOIN parents ON children.parent_id = parents.id WHERE parents.grade > --Whatever value you pass as min_grade 

のようになります。子供は一つだけの親を持っているので、私はそれが単一のオブジェクトのスコープにあまり意味があるとは思わない:/おそらく 'nilを返しますif parent.grade> min_grade'? – gabrielhilal

+0

私はより大きい学年の親を持つすべての子供を返すしたいと思います。私は子供のすべてを取得し、あなたが提案する "if"によって一つずつチェックしたくありません。 – Mateu

答えて

3

あなただけ

class Child < ApplicationRecord 
    belongs_to :parent 
    scope :with_great_parent, -> (min_grade) {joins(:parent).merge(Parent.great(min_grade))} 
end 

はあなたのためにこれを処理する必要があり、その後スコープにマージする探している場合。生成されたSQLは、より多くの情報

+0

はい!それでおしまい!ありがとう – Mateu

0

ええと、ちょうどgrade > :gradeのクエリの前にparents.を置く必要があります。そして、joinsメソッドのスペルミスがあります。そのような子モデルに

てみ使用範囲:

class Child < ApplicationRecord 
    belongs_to :parent 
    scope :wit_great_parent, -> (min_grade) { 
     joins(:parent).where("parents.grade > :grade", grade: min_grade) 
    } 
end 
関連する問題