如何通过与Active Record关联找到has_many中缺少相关记录的记录?

时间:2013-03-23 13:51:22

标签: ruby-on-rails

我们有“主题 - 关系 - 类别”。

也就是说,主题通过关系有很多类别。

我认为通过类别

获取主题非常容易
  #Relationship  Model
  Topic_id: integer
  Category_id: integer

  @topics=Topic.joins(:relationships)

但是,并非每个主题都有一个类别。那么我们如何检索没有类别的主题呢? 是否有减号查询?

也许它看起来像@topics=Topic.where('id NOT IN (?)', Relationship.all) 我在activerecord equivalent to SQL 'minus'找到了它,但不确定这个解决方案。

2 个答案:

答案 0 :(得分:11)

真的,作为一种关系会更好。认为这样可行:

@topics = Topic.joins('left join relationships on relationships.topic_id = topics.id').where('relationships.category_id is null')

或者这个:

@topics = Topic
    .joins('left join relationships on relationships.topic_id = topics.id join categories on categories.id = relationships.category_id')
    .group('topics.id').having('count(categories.id) = 0')

答案 1 :(得分:0)

我一直在寻找最简单的答案,我认为这是使用includes

topics = Topic.includes(:relationships).where(relationships: {id: nil})

另一种方式,更正确,让你认为SQL是LEFT OUTER JOINS

Topic.joins("LEFT OUTER JOINS relationships ON relationships.topic_id = topics.id")
     .where(relationships: {id: nil})