我想找到所有不自动的车辆。在我的Vehicle模型中,我有一个方法auto,返回true表示自动,false表示手动。在rails控制台中,如何返回所有手动车辆的列表?以下不起作用:
vehicles = Vehicle.find(:all);
manual_vehicles = vehicles.Where(auto.present? != true);
模型/ vehicle.rb
def auto
Auto.where(:vehicle_id=>self.id)
end
答案 0 :(得分:1)
Vehicle.all.select(&:auto?)
请注意,如果有大量车辆,这种情况会很慢,因为它们都会装入红宝石。因此,在SQL中进行测试更有效。例如。如果您的#auto?
方法仅查看auto
布尔字段,则可以执行此操作:
Vehicle.where(auto: true)
这样做的好处是可以将结果作为Relation
而不是Array
,这样可以在调用数据库之前进一步优化下游语句。
答案 1 :(得分:1)
在我的Vehicle模型中,我有一个方法auto,返回true 手动自动和虚假。
这是假的,您的以下方法返回一个ActiveRecord :: Relation,其中包含属性vehicle_id
等于Vehicle id
的所有Auto:
def auto
Auto.where(:vehicle_id=>self.id)
end
如果你想要一段代码来测试一辆车是否有与之关联的汽车,请使用:
def auto?
Auto.where(vehicle_id: self.id).present? # returns TRUE or FALSE
end
然后,如果您想全部 车辆 手动:
Vehicle.all.select{|vehicle| vehicle.auto? != true }
或者在DB级别(更快,更好,更强!):
Vehicle.where('id NOT IN (?)', Auto.pluck(:vehicle_id).uniq.compact)
# This will get all vehicles where there id is not contained in the Auto table