Rails Scoped has many through has many with scope

问题描述

我有一个带范围的模型有很多。我想链接一个有很多通过:


 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: 关联只是采用它加入的另一个关联的名称。您不能定义通过 association extension 的关联,您错误地将其称为范围。

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

如果你想真正创建 a scoped association,你需要传递一个可调用的,比如 lambda。

has_many :open_issues,class_name: 'Issue'

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

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

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