2013-01-23 204 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

它的工作原理。我需要做一個子查詢,但是我對此很滿意。 –