Rails使用.last并获取id而不是第一次使用id

时间:2013-01-06 05:40:12

标签: ruby-on-rails

当我的应用创建新工单时,它还会创建与该工单相关联的第一个任务。新任务应该将taskstatus设置为Taskstatus表中的第一个id。

Taskstatus表中的第一条记录碰巧有一个id = 2 但是,代码设置task.taskstatus_id = 1

工作订单控制器代码:

  before_create :first_task

  protected
  def first_task
   self.tasks.build taskstatus_id: Taskstatus.first, taskname: self.description
  end

我错过了什么? 谢谢!

更新---- taskstatus表中的第一条记录的id = 2.删除了id = 1的记录。我希望新任务记录有一个taskstatus_id = 2。

在taskstatus.rb中,我有:

  default_scope :order => 'id ASC' 

这也创建了taskstatus = 1

的任务
Taskstatus.limit(1)

我正在使用postgreSQL。

在taskstatus索引页面上,3条记录显示=

id statuscode

2新

3开始

4完成

发生了奇怪的事!

更新2 - 你不会相信这个!!!!!! (我不会) - 但是,这是真的。

我将代码更改为:

Taskstatus.where(:statuscode => "New")

即使New有id = 2,任务也得到1

postgreSQL会出现问题吗?

2 个答案:

答案 0 :(得分:1)

试试这个

Taskstatus.order("id").first

答案 1 :(得分:1)

正如其他人所说,.first是无序的。

您可以通过添加显式排序(.order(:id).first)或使用default_scope 总是对结果进行排序来解决此问题:

class Taskstatus < ActiveRecord::Base

  default_scope order(:id)

end

现在Taskstatus.first将始终是第一条按id排序的记录。如果您的订单发生变化,这可能会很有用,最后考虑使用最早的created_at作为“第一”记录。