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")