Rails 3 - 选择不包含关联模型的对象?

时间:2013-10-31 23:26:51

标签: ruby-on-rails-3 activerecord

(使用Rails 3)

我在has_many中通过关联有2个模型(Vehicle和Capabilities)。

因此,车辆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实现。

2 个答案:

答案 0 :(得分:0)

尝试此查询

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

答案 1 :(得分:0)

我最终做了类似的事情,受到了Thaha 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