2013-01-23 159 views
0

快速概要。选择与所有给定记录有关系的记录

祭有属于许多功能 功能已属于许多产品

我想发现脑水肿ALL所选功能的所有产品。

实施例:

  • 的Offering_1具有特征1
  • 的Offering_2具有特征2
  • 的Offering_3具有特征1和特征2
  • 的Offering_4具有特征1,特征2和功能3

当我打电话Offering.with_features([1,2,3])我期望找到只有这个Offering_4是因为是唯一一个具有三个特征的。

这似乎是一个愚蠢的问题,但我不能找到一个很好的连接,它返回的结果。所有加入我测试过returs有给定特征的任何,不ALL的产品。

想法?

UPDATE

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 

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

+0

连接表的名称是什么?原生SQL查询是否足够? – doublea

+0

连接表是'features_offerings',遵循导轨的约定。 当然,一个sql语句应该足够了。我应该能够将其翻译成AR查询语言。 –

+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,:通过,而不是has_and_belongs_to_many。一般对我来说效果更好。在这种情况下,思考会使查询更容易。
  2. 会推荐使用斯坦福DB类的工具。关于关系代数和SQL查询的早期视频对我非常有帮助。

http://class2go.stanford.edu/db/Winter2013

得走。再次,如果您需要更多,请联络。

干杯,

+0

它的工作原理。我需要做一个子查询,但是我对此很满意。 –