Postgresql& Rails 3 - 对数组中元素的Update_attribute重新排序数组..为什么?

时间:2011-05-18 03:55:24

标签: ruby-on-rails arrays ruby-on-rails-3 postgresql

Postgresql / Rails 3 / Ruby 1.9.2 / OSX

class Deliverable < ActiveRecord::Base
  has_many :models, :dependent => :destroy

  def build_template
    models << sect_letterhead << sect_ica << sect_project_description_exhibit
  end

end



ruby-1.9.2-p180 :002 > d.models.first
 => #<Model id: 1, company_id: nil, deliverable_id: 1, model_id: nil, type: nil, kind: "cover_page", csv_file_name: nil, csv_content_type: nil, csv_file_size: nil, csv_updated_at: nil> 

ruby-1.9.2-p180 :003 > d.models.first.update_attribute(:csv_file_name, "blah")
 => true 

ruby-1.9.2-p180 :004 > d.models.first
 => #<Model id: 5, company_id: nil, deliverable_id: 1, model_id: nil, type: nil, kind: "opening_letter", csv_file_name: nil, csv_content_type: nil, csv_file_size: nil, csv_updated_at: nil> 

每当我update_attribute一个模型时,该模型被推送到数组的末尾。除了分配自定义排序属性以避免在调用update_attribute时更改数组顺序时,还有其他方法吗?我可以很容易地做到这一点,但我对数据库的行为感兴趣。

即使从模型对象中删除时间戳,行为仍然存在。

如果没有时间戳记来跟踪哪个模型刚刚更新,会出现这种情况?或者当我调用update_attribute时,模型是否实际从数组中拉出并放回到最后位置?

1 个答案:

答案 0 :(得分:3)

我不是PostgreSQL专家,但我注意到了同样的行为。我的理解是PostgreSQL本身没有默认顺序(而MySQL是可靠的 - 据我所知 - 在主键排序时)。 PostgreSQL的数据格式可能意味着修改后的记录会转移到最后。

简而言之:这不是Rails的东西 - 它是PostgreSQL的东西,因此时间戳无关紧要。

无论哪种方式,它都会迫使您明确要求退回物品的顺序。这不是一个糟糕的主意。