1

我想找到所有不是自动的车辆。在我的车辆模型中,我有一个 auto 方法,自动返回 true,手动返回 false。在 rails 控制台中,如何返回所有手动车辆的列表?以下不起作用:

vehicles = Vehicle.find(:all);

manual_vehicles = vehicles.Where(auto.present? != true);

模型/车辆.rb

def auto
  Auto.where(:vehicle_id=>self.id)
end
4

2 回答 2

1
Vehicle.all.select(&:auto?)

请注意,如果有大量车辆,这会很慢,因为它们都会被加载到 ruby​​ 中。因此在 SQL 中进行测试效率更高。例如,如果您的#auto?方法仅查看auto布尔字段,您可以这样做:

Vehicle.where(auto: true)

这还具有将结果作为 aRelation而不是a 的优点Array,这允许您在调用数据库之前进一步细化下游的语句。

于 2013-06-10T14:45:14.993 回答
1

在我的车辆模型中,我有一个 auto 方法,自动返回 true,手动返回 false。

这是错误的,您的以下方法返回一个 ActiveRecord::Relation 包含属性vehicle_id等于 Vehicle的所有 Auto id

def auto
  Auto.where(:vehicle_id=>self.id)
end

如果您想要一段代码来测试 Vehicle 是否有与之关联的 Auto,请使用以下代码:

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
于 2013-06-10T15:15:58.280 回答