Rails方法返回不同的响应

时间:2014-02-05 22:22:02

标签: sql ruby-on-rails

当我在每个区块中使用卡车对象来调用.deliveries.last时,rails不会返回具有该卡车最高ID的交付。

@todays_workdays = Workday.todays_workdays
@todays_workdays.each do |workday|
  @working_trucks << workday.driver.truck
end
@working_trucks.each do |truck|
  if truck.deliveries.last.time_arrived.between?(Time.zone.now.beginning_of_day,Time.zone.now.end_of_day) # returns a delivery for each truck but not its actual last delivery (e.g. id 447)
    ...
  end
end

但是当我使用Truck.find(truck.id)时,它正常工作,返回每辆卡车的最后一次交付

if Truck.find(truck.id).deliveries.last.time_arrived.between?(Time.zone.now.beginning_of_day,Time.zone.now.end_of_day) # returns proper last delivery for each truck (e.g. id 486)
  ...
end

我不确定为什么会这样。任何帮助/解释将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

如果您使用的是Rails 3.x ActiveRecord不会自动命令从数据库中提取记录 - 最后一个不是具有最高主键的记录。在Rails 4中,ActiveRecord按主键排序。

对于Rails 3,请尝试if truck.deliveries.order(:id).last....

我可能还建议将一些逻辑分解到模型中的范围,即

  • 可单独测试

  • 以语义方式命名(由你)

  • 可链接,因此可以在您的代码库中重复使用

More info on scopes