轨道 3 - 选择不包括关联模型的对象



(使用 Rails 3)

我有 2 个模型(车辆和能力)在通过关联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或挤压宝石,但除非有更简单的解决方案,否则欢迎任何arel_table实现。

尝试此查询

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

我最终做了类似的事情,灵感来自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

最新更新