2016-11-14 114 views
2

問題

可以說我有has_many-belongs_to關係的兩個模型。 has_many有一個定義的範圍和一個名爲grade的整數屬性。使用範圍belongs_to關聯範圍在第一個模型 - Ruby on 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 

我想在子模型上創建一個範圍,它使用父模型的範圍。

有沒有辦法讓我可以使用Parent的範圍定義?

目前的解決方案

我這樣做是正確的,現在的方式是

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

不過,我複製在這兩個地方的where子句。

問題

有沒有辦法從子模型調用父範圍?

+0

孩子只有一個父母,所以我不認爲它使多大意義,範圍的單個對象:/也許'回報爲零如果parent.grade> min_grade'? – gabrielhilal

+0

我想返回所有擁有更高年級的父母的孩子。我不想讓所有的孩子都接受你提出的「如果」一個一個的檢查。 – Mateu

回答

3

如果你只是在尋找的範圍,然後合併

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

應該處理這個給你。生成的SQL將類似於

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

ActiveRecord::SpawnMethods#merge以獲取更多信息

+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