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

我正在从rails 3.2.13升级到4并遇到更新模型的问题。 我正在尝试更新我只有id的模型上的单个属性,我也想要validation和回调。 这在轨道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但它跳过我想要的validation和回调时,它可以正常工作。

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

我也碰到了那个。

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

对我来说这是Rails中的一个错误。 但也许它的目的是这样的。

我将在一个独立的ruby文件中重现错误后立即在GitHub上的rails / rails上打开一个问题。 将使用链接更新此post。

User.select(:id).first将返回一个只有:id的User。 自Rails 3以来,这是否有所改变?

尝试使用

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

此外,你很幸运,那些User没有保存,因为如果他们是,它会看起来像:

 User id: 1 first_name: "John" 

并且不会保存其他信息。