假设我有两个带有has_many-belongs_to关系的模型。 has_many定义了范围,名为grade的整数属性。
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子句。
无论如何都要从子模型中调用Parent范围?
答案 0 :(得分:4)
如果您只想合并范围,那么
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
答案 1 :(得分:0)
嗯,也许,你只需要在parents.
查询到Child的范围之前放grade > :grade
。你拼错了joins
方法。
在子模型上尝试使用范围,如下所示:
class Child < ApplicationRecord
belongs_to :parent
scope :wit_great_parent, -> (min_grade) {
joins(:parent).where("parents.grade > :grade", grade: min_grade)
}
end