2014-02-27 59 views
4

我正在從rails 3.2.13升級到4並且遇到了更新模型時遇到的問題。我試圖更新模型中的一個屬性,我只有id,我也想驗證和回調。這種精細曾在軌道3,但我有在軌道4無法在沒有選擇updated_at屬性的情況下更新Rails 4中的模型

在軌道4,5麻煩,如果我做的:

user = User.select(:id).first 
user.first_name = 'name' 
user.save! 

我得到的錯誤:

NoMethodError: undefined method `type_cast' for nil:NilClass 
    from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4.0.3/lib/active_record/attribute_methods/time_zone_conversion.rb:10:in `type_cast' 

如果我運行rails 3 first_name中的相同代碼被更新,並且updated_at被更新爲current_time。

如果在軌道4,5我運行:

user = User.select(:id, :updated_at).first 
user.first_name = 'name' 
user.save! 

,一切工作正常。

我假設的錯誤是由事實的updated_at列不存在造成的,但它不應該需要的人。在我的許多查詢中,我只選擇了速度的ID。 Rails 3完美地處理了這一點。我也嘗試過使用update_attributes,但我收到了同樣的錯誤。它在我使用update_column時起作用,但它會跳過我想要的驗證和回調。

我不知道這是爲什麼在軌道4發生或如何讓周圍沒有顯式調用驗證和回調update_column後或選擇,我不應該需要做的updated_at屬性。

回答

1

User.select(:id).first將返回用戶只用一個:id。自從Rails 3以來,這個變化了嗎?

使用

User.find(id).update_attribute(:first_name, 'Name') 

而且,你是幸運的User小號沒有節省,因爲如果他們嘗試,它會看起來像:

User 
id: 1 
first_name: "John" 

,並沒有額外的信息將被保存。

+0

在導軌3和4中User.select(:id).first返回一個僅具有id屬性的用戶對象。如果我執行上面在rails 3中列出的代碼,我保存時的查詢是UPDATE「users」SET「first_name」= name,「updated_at」='2014-02-28 01:17:30.448205'WHERE「users」。「 id「= 1這正是我想要的,但它在rails 4中不起作用。 – user2297272

+0

也是,update_attribute調用保存,所以您的所有回調仍應該運行。 – Donald

+0

update_attribute導致與上面相同的錯誤 – user2297272

3

我也遇到過。

這個問題似乎是的updated_at未加載。 當你update_attribute時,它也會嘗試更新updated_at。 它試圖找到類型轉換該列的方式,但由於沒有選擇,所以該列未加載。

對我來說這是Rails中的一個bug。 但也許它打算是這樣的。

,因爲我在一個獨立的紅寶石文件中再生的bug我會盡快打開GitHub上軌/軌道的問題。將更新這個帖子的鏈接。

+1

我得到了Rails 4.1.6的錯誤,只有在使用PostgreSQL時,不是MySQL(我正在切換DB)。使用MySQL,它與一切完全一致。我只是將updated_at添加到我的選擇中以繼續使用PostgreSQL。 – Hugo

相關問題