在第一个模型中使用belongs_to关联的作用域进行作用域-Ruby on Rails

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子句。

是否有任何从子模型调用父范围的方法?

eng*_*nky 5

如果您只是想合并范围,那么

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更多信息