2011-05-18 55 views
0

PostgreSQL的/導軌3 /紅寶石1.9.2/OSXPostgresql&Rails 3 - 數組中元素的Update_attribute重新排列數組..爲什麼?

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時,模型實際上是從數組中退出並放回最後一個位置?

+0

在model.rb中添加了「default_scope order('id')」修復了這個問題,但我仍然不明白爲什麼默認是在一個看似虛幻的目錄下updated_at – pendevere 2011-05-18 04:05:24

+0

更新屬性後嘗試'd.models.first.save' – 2011-05-18 04:48:51

回答

3

我不是PostgreSQL專家,但我注意到了相同的行爲。我的理解是,PostgreSQL本身沒有默認順序(而據我所知,MySQL是可靠的 - 按主鍵排序)。 PostgreSQL的數據格式可能意味着修改過的記錄會轉移到最後。

簡而言之:這不是一個Rails的東西 - 它是一個PostgreSQL的東西,因此時間戳爲什麼不重要。

無論哪種方式,它都會強制您明確要退回的物品的順序。不是一個可怕的想法。