选择与所有给定记录有关系的记录

时间:2013-01-23 15:45:29

标签: ruby-on-rails join rails-activerecord

快速摘要。

产品具有并属于许多功能 功能具有并属于许多产品

我想找到所有能够全部所选功能的产品。

示例:

  • Offering_1具有feature1
  • Offering_2具有feature2
  • Offering_3具有feature1和feature 2
  • Offering_4具有feature1,功能2和功能3

当我致电Offering.with_features([1,2,3])时,我希望找到的Offering_4,因为它是唯一具有三个功能的人。

这似乎是一个愚蠢的问题,但我找不到能够返回结果的好连接。我测试过的所有联接都会重新提供给定功能 ANY 的产品,而不是 ALL

想法?

更新

按照 doublea 的建议,我创建了具有自己的ID而不是连接表的表。 它的解决方案仍然有效,我的实现方式如下:

# offering.rb
def self.with_features(features)
  if features && features.any?
    where(id: FeatureOfferingRelation.with_all_features(features).pluck(:offering_id))
  else
    scoped
  end
end

# feature_offering_relation.rb
def self.with_all_features(features)
  select(:offering_id)
    .where(feature_id: features)
    .group(:offering_id)
    .having("count(distinct feature_id) = ?", features.size)
end

有效!!但是我会接受使用连接而不是子查询的其他想法。

1 个答案:

答案 0 :(得分:1)

认为查询将是这样的。让我知道它是否有效,否则将在以后测试它/修复它。

"select offering_id from features_offerings where feature_id in (?) 
group by offering_id having count(distinct feature_id) = ?", 
feature_ids, feature_count

一些事情:

  1. 建议使用合适的模型作为连接表,因此 has_many,:through ,而不是 has_and_belongs_to_many 。一般来说对我来说效果更好。在这种情况下,想想会使查询更容易生成。
  2. 建议使用Stanford DB类进行工具。有关关系代数和SQL查询的早期视频对我非常有帮助。
  3. http://class2go.stanford.edu/db/Winter2013

    得跑。如果您需要更多,请再次联系。

    干杯,