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})")