我正在从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属性的情况下解决这个问题。
答案 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"
并且不会保存其他信息。