Mat*_*teu 4 ruby ruby-on-rails rails-activerecord ruby-on-rails-5
可以说我有两个具有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
Run Code Online (Sandbox Code Playgroud)
我想在子模型上创建一个范围,该范围使用父模型的范围。
无论如何,我可以在Parent上使用作用域的定义吗?
我现在做的方式是
class Child < ApplicationRecord
belongs_to :parent
scope :wit_great_parent, -> (min_grade) {
join(:parent).where("grade > :grade", grade: min_grade)}
end
Run Code Online (Sandbox Code Playgroud)
但是,我在两个地方都复制了where子句。
是否有任何从子模型调用父范围的方法?
如果您只是想合并范围,那么
class Child < ApplicationRecord
belongs_to :parent
scope :with_great_parent, -> (min_grade) {joins(:parent).merge(Parent.great(min_grade))}
end
Run Code Online (Sandbox Code Playgroud)
应该为您处理。生成的SQL将类似于
SELECT *
FROM children
INNER JOIN parents ON children.parent_id = parents.id
WHERE
parents.grade > --Whatever value you pass as min_grade
Run Code Online (Sandbox Code Playgroud)
查看ActiveRecord::SpawnMethods#merge更多信息