在第一个模型中使用belongs_to关联的范围 - Ruby on Rails

时间:2016-11-14 16:51:00

标签: ruby-on-rails ruby ruby-on-rails-5 rails-activerecord

问题

假设我有两个带有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范围?

2 个答案:

答案 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