更新Rails中的所有记录时保持原始顺序

时间:2019-02-19 15:28:15

标签: ruby-on-rails ruby

我有一张桌子

create table foos
(
    id int,
    bar varchar(1),
    var int
)

和相应的模型类

class Foo < ApplicationRecord
  self.table_name = "foos"
end

我按如下所示直接用ruby控制台./script/rails console填写表格

Foo.new(:id => 1, :bar => "x", :var => 2).save
Foo.new(:id => 2, :bar => "y", :var => 2).save
Foo.new(:id => 3, :bar => "z", :var => 3).save

如果我用Foo.all打印记录,我会得到此订单

#<ActiveRecord::Relation [
    #<Foo id: 1, bar: "x", var: 2>, 
    #<Foo id: 2, bar: "y", var: 2>, 
    #<Foo id: 3, bar: "z", var: 3>]> 

如果我在数据库上查询select * from foos,则会得到相同的订单

id  bar  var
-------------
1   x    2
2   y    2
3   z    3

然后,我将每个记录barvar的列2的值为a

Foo.where(:var => 2).update_all(:bar => "a")

如果我再次打印出记录,我会得到另一个订单

#<ActiveRecord::Relation [
    #<Foo id: 3, bar: "z", var: 3>, 
    #<Foo id: 1, bar: "a", var: 2>, 
    #<Foo id: 2, bar: "a", var: 2>]> 

如果我在数据库上查询select * from foos

id  bar  var
-------------
3   z    3
1   a    2
2   a    2

如果我按照说明更新记录,是否可以保留原始顺序?

2 个答案:

答案 0 :(得分:1)

您想要的是通过其ID order记录:

Foo.order(id: :asc)

答案 1 :(得分:0)

当您更新数据库中的字段时,取决于数据库配置,顺序为“较旧”字段,最后一个为“较年轻”字段,如果您在数据库中添加时间戳,则会对其进行查看。然后,如果要在sql中订购,则应使用“ order”,然后使用要订购的字段。

Foo.order(id: :asc)
Foo.order(id: :desc)