Ruby on rails 查找不符合';I don’我没有太多:通过交往

Ruby on rails 查找不符合';I don’我没有太多:通过交往,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有三张桌子: advert.rb class Advert < ActiveRecord::Base has_many :postings, dependent: :destroy has_many :sites, through: :postings end class Posting < ActiveRecord::Base belongs_to :advert belongs_to :site end class Site < ActiveRecor

我有三张桌子:
advert.rb

class Advert < ActiveRecord::Base
  has_many :postings, dependent: :destroy
  has_many :sites, through: :postings
end
class Posting < ActiveRecord::Base
  belongs_to :advert
  belongs_to :site
end
class Site < ActiveRecord::Base
end
但它似乎不起作用

我的规格:

site1 = create :site
site2 = create :site
advert1 = create :advert
advert2 = create :advert
create(:posting, advert: advert1, site: site1)
create(:posting, advert: advert1, site: site2)
create(:posting, advert: advert2, site: site1)
expect(Advert.not_posted).to match_array([advert2])

你想得到所有的广告而不是任何网站吗?像这样轻松点

Advert.where.not(id: Posting.select(:advert_id))
以下是您的疑问:

Advert.includes(postings: :sites).where(sites: { id: nil })
你可能想通读一遍

至少有一个站点未链接的广告

因此,同样的逻辑将是:

  • A=查找
    属于所有
    网站的
    帖子
  • 最终结果=与A
我的问题是这样的:

a_query = %Q{
  SELECT advert_id
  FROM postings
  GROUP BY advert_id
  HAVING COUNT(DISTINCT site_id) = #{Site.count}
}

result = Advert.where("id NOT IN (#{a_query})")

请再读一遍我的问题。我需要找到所有的广告没有张贴到至少一个网站。不仅仅是没有帖子,我还将我的规格添加到了问题中,以使我的期望更加明确。您的解决方案返回[],这不是我所期望的(
a_query = %Q{
  SELECT advert_id
  FROM postings
  GROUP BY advert_id
  HAVING COUNT(DISTINCT site_id) = #{Site.count}
}

result = Advert.where("id NOT IN (#{a_query})")