【问题标题】:Can't set ActiveRecord attribute - stuck as Fixnum无法设置 ActiveRecord 属性 - 卡住为 Fixnum
【发布时间】:2013-02-27 11:18:48
【问题描述】:

我将记录的时间戳属性(datetime 类型)设置为0。我保存了它(或没有保存)。我尝试再次将其设置为0

a = MyModel.last # => #<MyModel id:...
a.updated_at     # => Tue, 12 Mar 2013 01:36:17 UTC +00:00
a.updated_at = 0 # => 0
a.updated_at = 0

我明白了:

NoMethodError: undefined method `change' for 0:Fixnum

即使在重新启动 rails 并从数据库(本地 sqlite3)重新加载记录之后也会发生这种情况。救命!

编辑:rails 控制台堆栈跟踪比我从服务器获得的更具有启发性:

NoMethodError: undefined method `change' for 0:Fixnum
       from /Users/nolan/.rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.11/lib/active_record/attribute_methods/time_zone_conversion.rb:69:in `round_usec'
       from /Users/nolan/.rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.11/lib/active_record/attribute_methods/time_zone_conversion.rb:46:in `fields_updasqliteted_at='
       from (irb):23
       from /Users/nolan/.rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in `start'
       from /Users/nolan/.rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.11/lib/rails/commands/console.rb:8:in `start'
       from /Users/nolan/.rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.11/lib/rails/commands.rb:41:in `<top (required)>'
       from script/rails:8:in `require'
       from script/rails:8:in `<main>'

【问题讨论】:

  • change 是什么?这是MyModel 的属性吗?
  • 不是 ActiveRecord 调用来更改记录的值...? :) 除了迁移方法,我不知道。
  • 刚刚检查过,其他型号也会出现这种情况...

标签: ruby-on-rails ruby-on-rails-3 activerecord


【解决方案1】:

您可以使用 update_column 绕过 Rails 回调和验证。

对于这种特定情况,使用 update_column 将绕过 RoR 使用的时区和其他方法回调,这些回调将失败,因为它没有预期到 FixNum。

【讨论】:

    【解决方案2】:

    由于魔术列的类型是日期时间,因此您不能为其分配整数。如果您愿意,可以使用以下链接:

    Ruby / Rails: convert int to time OR get time from integer?

    【讨论】:

    • 一旦我给它分配了一个整数(错误地),它应该是不可设置的吗??
    • 如果你给它分配一个整数,它会引发上述错误(你发布的那个)。您可以分配一个 nil 值而不是 0。
    • 是的,但是如果我确实将它设置为整数,那么我永远无法将它改回来?
    • 您可以从我在答案中发布的链接获得帮助。
    • 看来我可以使用update_column 绕过rails 所做的时区魔法并成功地将其从Fixnummery 中拯救出来......谢谢@Gabriel Cebrian
    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2013-04-21
    相关资源
    最近更新 更多