在RubyonRails中创建一个作用域,只有当所有关联的实例都符合特定条件时,该作用域才会返回对象的实例



我有一个名为Carts的表,它与另一个称为Subcarts的表具有has_many关系。我想创建一个范围,返回Cart表的所有实例,其中所有关联的子部分都符合特定条件(例如:subcart.status==1(。如果与Cart实例关联的一个子Cart的状态为1,则查询不应返回Cart实例。

scope :cart_bucket, -> {
includes(:subcarts).
where.not('subcarts.status = ?', 1).
references(:subcarts)

我还尝试在查询中使用select,但由于返回数组数据类型的原因,返回了一个错误。我希望将其保留在一个范围内,如果可能的话,不创建方法。

您可以从状态不为1的子部分中选择所有推车ID,并将其用作where子句,以排除所有与这些ID匹配的推车:

Cart.where('NOT EXISTS (SELECT s.cart_id FROM subcarts s WHERE s.cart_id = carts.id AND s.status = 1)')

ActiveRecord版本可能会有一些变化:

Cart.where.not(id: Subcart.where(status: 1).select(:cart_id))

在那里,生成的SQL使用NOT IN子句而不是NOT EXISTS

最新更新