2014-09-11 38 views
0

我有誰可以有很多功能的模型用戶對象:Rails的ActiveRecord的找到特定的兒童協會

class User << ActiveRecord::Base 
    has_many :features, dependent: :destroy 
end 

class Feature << ActiveRecord::Base 
    belongs_to :user 
    # columns id, user_id, name 
end 

我有2個功能,我可以把一個名爲「FEAT1」和「FEAT2」的2個功能用戶可以結合總共4種類型的用戶的:

  1. 用戶已經FEAT1 ONLY
  2. 用戶已經FEAT2 ONLY
  3. 用戶同時FEAT1和FEAT2
  4. 用戶既沒有feat1和feat2

我想創建範圍在用戶範圍內的4種類型的用戶。

User.only_feat1 
User.only_feat2 
User.both_feats 
User.no_feats 

我一直在.merge,.uniq,.joins,.includes玩耍,但似乎無法找出ActiveRecord的方式。

+0

在哪裏使用。 'scope:name,lambda {where(「(SELECT ... FROM features ... LIMIT 1)=?」,123)}' – Oleander 2014-09-11 00:38:28

+0

@lurker看看上面的模型。應該很明顯。 – Oleander 2014-09-11 00:42:37

+0

我將重新說明我的問題:功能表是否只包含兩個功能?如果有超過兩個,那麼你是否在這種情況下關心其他功能(feat3,feat4等)? – lurker 2014-09-11 00:49:13

回答

0

所以這裏是我的解決方案。它涉及大量的原始SQL,但它完成了工作。問題是,如果我多次將同一個表(功能部件)加入到我的用戶表中,那麼where子句會被覆蓋,而且我無法執行多個連接。

因此,爲了解決這個問題,我寫了很多原始的sql,它明確地強制連接表上的表,以強制雙連接表。

scope :without_feature, ->(feat) { joins("LEFT OUTER JOIN features af ON users.id = af.user_id AND af.name = '#{feat}'").where(af: {id: nil}) } 
scope :feat1, -> { joins("INNER JOIN features rs ON users.id = rs.user_id AND rs.name = 'feat1'") } 
scope :feat2, -> { joins("INNER JOIN features rr ON users.id = rr.user_id AND rr.name = 'feat2'") } 
scope :both_feats, -> { feat1.feat2 } 
scope :only_feat1, -> { feat1.without_feature('feat2') } 
scope :only_feat2, -> { feat2.without_feature('feat1') } 

希望這可以幫助其他人。