Ruby on rails 3.2 Rails作用域返回所有关联都符合条件的记录

Ruby on rails 3.2 Rails作用域返回所有关联都符合条件的记录,ruby-on-rails-3.2,named-scope,Ruby On Rails 3.2,Named Scope,我在编写返回记录的作用域时遇到问题,其中所有的多个关联都符合一个条件 我有这些模型: class Product has_many :listings end class Listing belongs_to :product belongs_to :issue end class Issue has_many :listings end 基本上,一个产品可以列在几个不同的问题。我希望能够得到所有的产品,没有在一个特定的问题清单。到目前为止,我的产品模型中有以下范围: sc

我在编写返回记录的作用域时遇到问题,其中所有的多个关联都符合一个条件

我有这些模型:

class Product
  has_many :listings
end

class Listing
  belongs_to :product
  belongs_to :issue
end

class Issue
  has_many :listings
end
基本上,一个产品可以列在几个不同的问题。我希望能够得到所有的产品,没有在一个特定的问题清单。到目前为止,我的产品模型中有以下范围:

scope :not_listed_in, lambda { |issue|
  joins(:listings)
    .where("listings.issue_id != ?", issue.id)
}

这不起作用,因为它会找到至少一个列表不在问题中的任何产品。我需要一些方法来询问特定问题中没有列表的所有产品。

假设您使用的是ActiveRecord,您可以通过查找所有产品并删除问题中的产品来实现这一点。这通常会产生一个数组,所以在下面的代码中,我做了一个额外的数据库查询,让它返回一个作用域结果,这样您就可以将其他“where”子句级联到结果中

class Product < ActiveRecord::Base
  has_many :listings
  scope :not_listed_in, lambda { |issue|
    id_list = Product.pluck(:id) - issue.products.pluck(:id)
    Product.where(id:id_list)
  }
end

class Listing < ActiveRecord::Base
  belongs_to :product
  belongs_to :issue
end

class Issue < ActiveRecord::Base
  has_many :listings
  has_many :products, through: :listings
end
类产品
我最后用#拒绝做了类似的事情,但我更喜欢这个。谢谢我更新了我的答案——我注意到一个很酷的AR方法——Pullc——它创建一个简单的DB查询,只获取一列并返回一个值数组——这正是这里需要的。