我的 Job
模型具有在迁移文件中定义的 job_date
字段,如下所示:
create_table :jobs do |t|
t.date "job_date", :null => false
[...]
end
在我的开发环境(Windows 上)中,当我这样做时:
job = Job.new(:job_date => "17/04/2011")
一切正常(即job_date
设置正确),而当我这样做时:
job = Job.new(:job_date => "04/17/2011")
job_date
设置为 nil
。
我猜这是因为数据库(MySQL)期望以DD/MM/YYYY
格式获取日期。
问题是在我的生产环境中,发生了完全相反的情况,即:
job = Job.new(:job_date => "04/17/2011")
正确设置“job_date”,同时:
job = Job.new(:job_date => "17/04/2011")
将其设置为nil
。
如何解决这种不一致问题?
是否有某种方法可以将数据库配置为特定日期格式(例如DD/MM/YYYY
)?
最佳答案
这不是数据库问题,但我认为这是 Ruby 中 Date.parse
方法的问题。事实上,当您调用 Job.new 时,它不会保存到数据库,只会创建模型的新对象。我相信 Rails 调用 Date.parse
方法将字符串转换为日期对象,它在我的机器中给出了 dd/mm/yyyy
格式的错误
Date.parse("17/04/2011")
=> ArgumentError: invalid date
from /usr/lib/ruby/1.8/date.rb:956:in `new_by_frags'
from /usr/lib/ruby/1.8/date.rb:1000:in `parse'
from (irb):3
我认为 Rails 会避免此错误,并为此类值提供 nil
job = Job.new(:job_date => "17/04/2011")
job.job_date
=> nil
job = Job.new(:job_date => "04/17/2011")
job.job_date
=> Sun, 17 Apr 2011
我猜你的生产环境的结果与我的机器和你的开发机器的 Ruby 相同,Date.parse
可能适用于其他格式。
如果您只需要处理一种格式(dd/mm/yyyy
或 mm/dd/yyyy
),您可以使用 Date.strptime
在提供给数据库之前计算日期
job_date = Date.strptime("17/04/2011", "%d/%m/%Y") # or "%m/%d/%Y"
job = Job.new(:job_date => job_date)
这对于一种格式在您的生产和开发环境中都适用。
关于mysql - rails 3 : How to solve an inconsistency in date format in development and production environments?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5431154/