如果不选择updated_at属性,则无法在Rails 4中更新模型

时间:2014-02-27 22:40:24

标签: ruby-on-rails ruby ruby-on-rails-4

我正在从rails 3.2.13升级到4并遇到更新模型的问题。我正在尝试只更新模型中的一个属性,我只有id,我也想要验证和回调。这在轨道3中运行良好但我在轨道4中遇到了麻烦。

如果我这样做在轨道4中:

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并使用current_time更新updated_at。

如果在轨道4中我跑:

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

一切正常。

我认为错误是由于updated_at列不存在而引起的,但它不应该是。在我的许多查询中,我只选择id作为速度。 Rails 3完美地处理了这个问题。我也尝试使用update_attributes但我收到了同样的错误。当我使用update_column但它跳过我想要的验证和回调时,它可以工作。

我不确定为什么会在rails 4中发生这种情况,或者如何在没有显式调用update_column之后的验证和回调或者选择我不应该执行的updated_at属性的情况下解决这个问题。

2 个答案:

答案 0 :(得分:3)

我也碰到了。

问题似乎是没有加载updated_at。 当你update_attribute时,它也会尝试更新updated_at。 它试图找到键入强制转换该列的方法,但是由于未选中,因此未加载该列。

对我而言,这是Rails中的一个错误。 但也许它应该是这样的。

一旦我在一个独立的ruby文件中重现了这个bug,我就会在GitHub上的rails / rails上打开一个问题。将使用链接更新此帖子。

答案 1 :(得分:1)

User.select(:id).first将返回仅包含:id的用户。自Rails 3以来,这是否有所改变?

尝试使用

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

另外,你很幸运User没有保存,因为如果它们存在,它会看起来像:

User
 id: 1
 first_name: "John" 

并且不会保存其他信息。