如果模型的方法返回false,则Rails控制台返回模型的返回列表

时间:2013-06-10 14:43:23

标签: ruby-on-rails

我想找到所有不自动的车辆。在我的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

2 个答案:

答案 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