Rails Scoped 有很多 through 有很多 with scope
Rails Scoped has many through has many with scope
我有一个带范围的模型有很多。我想将 a has many through 链接到:
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
这里belongs_to一个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 的关联,您错误地将其称为范围。
范围实际上只是一个 class 方法,可以在任何关系上调用(因为它代理 class),而关联扩展只能在 association proxies 上调用。
如果你想实际创建 a scoped association,你需要传递一个可调用函数,例如 lambda。
has_many :open_issues,
-> { where(status: 'open') },
class_name: 'Issue'
这实际上只是将一组过滤器直接应用于关联本身。
something.xs.ys.for(z).bs
实际上与关联在 Rails 中的实际工作方式不兼容。关联不能在关系或关联代理对象上调用 - 只能在记录本身上调用。
我有一个带范围的模型有很多。我想将 a has many through 链接到:
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
这里belongs_to一个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 的关联,您错误地将其称为范围。
范围实际上只是一个 class 方法,可以在任何关系上调用(因为它代理 class),而关联扩展只能在 association proxies 上调用。
如果你想实际创建 a scoped association,你需要传递一个可调用函数,例如 lambda。
has_many :open_issues,
-> { where(status: 'open') },
class_name: 'Issue'
这实际上只是将一组过滤器直接应用于关联本身。
something.xs.ys.for(z).bs
实际上与关联在 Rails 中的实际工作方式不兼容。关联不能在关系或关联代理对象上调用 - 只能在记录本身上调用。