Ruby on rails 创建带有历元时间戳的活动模型datetime

Ruby on rails 创建带有历元时间戳的活动模型datetime,ruby-on-rails,ruby,datetime,activerecord,epoch,Ruby On Rails,Ruby,Datetime,Activerecord,Epoch,我有一个移动应用程序,它可以通过使用SimpleEvent模型的标准路由向Rails应用程序发送Post请求来创建事件。模型的重要部分在模式中如下所示: create_table "simple_events", force: true do |t| t.datetime "start_date", null: false t.datetime "end_date", null: false end 对于应用程序来说,最简单的方法是向上发送浮点值以指示时间,因为这是

我有一个移动应用程序,它可以通过使用
SimpleEvent
模型的标准路由向Rails应用程序发送Post请求来创建事件。模型的重要部分在模式中如下所示:

create_table "simple_events", force: true do |t|
    t.datetime "start_date",   null: false
    t.datetime "end_date",     null: false
end
对于应用程序来说,最简单的方法是向上发送浮点值以指示时间,因为这是它们在本地存储的方式。但是,当我尝试在rails控制台中使用带有以下行的历元时间戳创建
SimpleEvent
时:

SimpleEvent.create("start_date"=> 1406815132.0, "end_date"=> 1406815132.0)
我得到这个错误:

ArgumentError: argument out of range
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active_support/values/time_zone.rb:289:in `initialize'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active_support/values/time_zone.rb:289:in `new'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active_support/values/time_zone.rb:289:in `parse'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active_support/core_ext/string/zones.rb:9:in `in_time_zone'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/attribute_methods/time_zone_conversion.rb:37:in `start_date='
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/attribute_assignment.rb:45:in `public_send'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/attribute_assignment.rb:45:in `_assign_attribute'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/attribute_assignment.rb:32:in `block in assign_attributes'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/attribute_assignment.rb:26:in `each'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/attribute_assignment.rb:26:in `assign_attributes'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/core.rb:455:in `init_attributes'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/core.rb:198:in `initialize'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/inheritance.rb:30:in `new'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/inheritance.rb:30:in `new'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active_record/persistence.rb:33:in `create'
    from (irb):71
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands/console.rb:90:in `start'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands/console.rb:9:in `start'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:69:in `console'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
    from /Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands.rb:17:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'2.1.1 :072 >
ArgumentError:参数超出范围
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active\u support/values/time\u zone.rb:289:in'initialize'
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active\u support/values/time\u zone.rb:289:in“new”
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active\u support/values/time\u zone.rb:289:in“parse”
来自/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.4/lib/active\u support/core\u ext/string/zones.rb:9:in'in\u time\u zone'
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/attribute\u methods/time\u zone\u conversion.rb:37:in`start\u date='1
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/attribute\u assignment.rb:45:在“public\u send”中
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/attribute\u assignment.rb:45:in`\u assign\u attribute'
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/attribute\u assignment.rb:32:在“分配属性中的块”中
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/attribute\u assignment.rb:26:in'each'
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/attribute\u assignment.rb:26:in“assign\u attributes”
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/core.rb:455:in`init\u attributes'
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/core.rb:198:在“初始化”中
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/heritance.rb:30:in'new'
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/heritance.rb:30:in'new'
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.4/lib/active\u record/persistence.rb:33:在“创建”中
来自(irb):71
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands/console.rb:90:in'start'
来自/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands/console.rb:9:in'start'
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands/commands\u tasks.rb:69:在“控制台”中
from/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands/commands\u tasks.rb:40:in“run\u command!”
来自/Users/ataylor/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/commands.rb:17:in`'
从箱子/轨道:4:in“require”
从箱子/轨道:4:in`'2.1.1:072>

我试图在rails源代码中寻找可能的解释,但运气不太好。如何允许从模型中的时间戳创建日期时间?

我建议通过添加额外的函数将日期时间转换为日期时间并存储来保存日期时间

class SimpleEvent < ActiveRecord::Base

  def self.save_time start_time, end_time
      self.create(start_time: Time.at(start_time).to_datetime, end_time: Time.at(end_time).to_datetime
  end
end
class SimpleEvent
我们需要在模型本身中写一个函数,这样我们就可以把数据作为历元时间本身来读取

class SimpleEvent < ActiveRecord::Base

   def started_at
      self.start_time.to_i
   end

   def end_at
      self.end_time.to_i
   end
end 
class SimpleEvent
如果您仍然希望能够对正常时间对象或字符串使用
开始日期
结束日期
,我将创建两个新方法,从时间字符串设置开始日期/结束日期:

class SimpleEvent < ActiveRecord::Base
  def start_ts=(ts)
    write_attribute :start_date, DateTime.strptime(ts.to_s, '%s')
  end

  def end_ts=(ts)
    write_attribute :end_date, DateTime.strptime(ts.to_s, '%s')
  end
end

现在,当您使用start\u ts/end\ts方法创建SimpleEvent时,它将解析时间戳并适当地设置start\u date/end\u date。

我非常喜欢这个解决方案,但不幸的是它似乎对我不起作用。我添加了
attr\u访问器:start\ts
attr\u访问器:end\u ts
以消除这个错误:
ActiveRecord::UnknownAttributeError:unknown属性:start\u ts
但它仍然不保存,而是执行回滚,结果SimpleEvent对象的
开始日期
结束日期
属性为零。我遗漏了什么吗?很抱歉,我忘了在方法名称中添加
=
。我正在更新g我的答案是正确的方法名。谢谢!太好了。时间必须以数字格式发送,而不是像我将要更新的原始问题中的字符串那样发送,而且我根本不需要
attr\u访问器
行,与您的答案一致。@kujenga,我将更新我的答案,以将
ts
作为字符串、整数、o进行处理r浮动。
SimpleEvent.create("start_ts"=>"1406815132.0", "end_ts"=>"1406815132.0")