Rails Scoped有很多通过有很多范围



我有一个带scoped的模型。我想把一个有很多通过:


class X < ApplicationRecord
has_many :ys, {foreign_key: :y_id} do
def for_z(z)
where("boolean_flag = #{z.boolean_flag}")  
end
has_many :bs, through: :ys # but I want to get only the bs for ys.for_z(z)
end

此处的y属于b

所以最后我想打电话给:

something.xs.ys.for(z).bs

现在我仍然可以做

something.xs.ys.for(z).map {|y| y.b}

但我想把关联正确地连接起来

您需要实际定义第二个关联:

class Project < ApplicationRecord
has_many :issues
has_many :open_issues,
-> { where(status: 'open') },
class_name: 'Issue'

has_many :assignees, through: :open_issues
end

has_many through:关联只是采用它通过其加入的另一个关联的名称。不能定义通过关联扩展的关联,因为您错误地将其称为作用域。

作用域实际上只是一个类方法,可以在任何关系上调用(因为它代理类(,而关联扩展只能在关联代理上调用。

如果您想实际创建一个作用域关联,则需要传递一个可调用函数,如lambda。

has_many :open_issues,
-> { where(status: 'open') },
class_name: 'Issue'

这实际上只是将一组过滤器直接应用于关联本身。

something.xs.ys.for(z).bs

实际上与关联在Rails中的实际工作方式不兼容。关联不可在关系或关联代理对象上调用,只能在记录本身上调用。

相关内容

  • 没有找到相关文章

最新更新