2011-05-22 36 views
1

這是一個Rails 3項目。如何使用ActiveRecord的「update」或「update_all」方法設置時間戳字段?

我只是不知道如何做到這一點。我有兩列:

last_migrated timestamp 
migration_message text 

,我想更新,與條件:

:subdomain => "someval" 

,但一切我曾嘗試已經失敗。我試過了我能想到的每個MyModel.update和MyModel.update_all變體。文件只是由於某種原因沒有穿透我厚厚的頭骨。請幫忙。

爲了澄清,我想使用AR方法來做到以下幾點:

update brands 
set last_migrated = x, 
    migration_message = y 
where subdomain = 'someval' 

回答

4

您可以只使用where方法是這樣的:

Brand.where(:subdomain => 'someval').update_all(:last_migrated => Time.now, :migration_message => 'Some message') 
0

的問題是不明確的,但如果你想更新模型的屬性然後使用:

ModelName.update_attributes!(:migration_message => "The message", :last_migrated => the_timestamp) if ModelName.subdomain == "someval" 

其中the_timestamp是一個DateTime對象或Date對象,具體取決於您在遷移中如何定義它。

對於update_all用法:

ModelName.where(<condition>).update_all(:migration_message => "The message", :last_migrated => Time.now) 
+0

怎麼樣的情況? – AKWF 2011-05-23 13:41:51

+0

編輯了答案,假設子域是模型的另一個屬性。如果它是其他東西,那麼訪問它,並添加到if條件類似。 – 2011-05-23 18:01:08

+0

我正在尋找一種「update_all」類型的解決方案,以便我不必循環訪問數千條記錄。 – AKWF 2011-05-25 14:16:07

0

我落得這樣做:

ActiveRecord::Base.connection.execute("update brands set migration_status = 'COMPLETE', migration_message = '', last_migrated = sysdate() where subdomain = '#{self.subdomain}'") 

這不是做在AR的最好辦法,是不是Rails的方式,但我在AR上試過的其他東西確實是而不是 behave(update_all),所以至少這是有效的。

由於沒有人可以回答我的問題(謝謝你嘗試阿米特),並且這個工作,那麼它仍然是答案,直到有人可以提供更好的答案。