2013-10-31 64 views
0

(使用Rails 3)Rails 3 - 選擇不包含關聯模型的對象?

我有2個模型(Vehicle和Capabilities)通過關聯has_many。

所以車輛1能夠有能力1(例如牽引),能力2(例如乘客),3能力(例如飛行)等

v = Vehicle.first 
v.capabilities.pluck(:name) #=> will give something like ['towing', 'passenger', 'flying'] 

我想找到它不能有所有車輛特殊能力,例如所有不能飛行的車輛。

我已經嘗試過類似下面的查詢,但它仍然包含飛行器,我認爲主要是因爲飛機也有其他功能。

non_flying = Vehicle.includes(:capabilities).where('capabilities.id NOT IN (?)', [2,3]) 
non_flying.first.capabilities.pluck(:name) #=> will give something like ['towing']. 

請注意,飛行能力不包括在內,但我只是不希望這輛車返回。我怎麼寫這個?

如果可能,我寧願不使用meta_wheel或squeel gems,但除非有更簡單的解決方案,否則歡迎使用任何arel_table實現。

回答

0

我結束了做一些與此類似,由塔哈KP的回答啓發。

# Get all flying vehicles first 
subquery = Vehicle.joins(:capabilities).where("capabilities.id IN (?)", 3).pluck("vehicles.id") 

# Then get all vehicles not in this flying vehicles array 
non_flying = Vehicle.where('vehicles.id NOT IN (?)', subquery).all 
0

嘗試此查詢

non_flying = Vehicle.all - Vehicle.includes(:capabilities).where('capabilities.id IN (?)', [2,3]).all