2013-12-26 2 views
2

У меня есть столбец даты рождения на моей пользовательской таблице, которая принимает DATE. Поскольку этот тип данных отображается как YYYY-MM-DD, я предполагаю, что при вводе даты в базу данных он должен иметь формат, например: 2013-12-26.Создание случайной даты без времени в Ruby

Я видел методы на StackOverflow для создания случайной даты в Ruby, например here. Однако после долгих поисков я не могу найти способ генерировать случайную дату без времени, например, за последние 100 лет, и правильно ее отформатировать для типа данных DATE. В Rails лучший способ генерировать случайную дату без времени?

Это похоже на работу:

 
    def rand_date(days) 
     date = Date.today-rand(days) 
     date.to_s(:db) 
    end 

Но есть более элегантное решение, которое поставляется с Rails? Я новичок в Rails и программировании, поэтому любая помощь была бы наиболее полезной!

ответ

3

Ваш метод верен. Если вы используете Rails, есть некоторые тривиальные улучшения, такие как

def rand_date(days) 
    rand(days).days.ago(Date.today) 
end 

который в основном эквивалентен

def rand_date(days) 
    rand(days).days.ago.to_date 
end 

Второй вариант менее эффективен, поскольку он создает больше Даты объекты/время во внутренних преобразованиях ,

Применить to_s(:db), если вам нужна дата для форматирования в виде строки.

Другой подход потребует, чтобы вы построили дату, передающую результат rand на Date.new.

2

Это в ядре ruby:

1 #!usr/bin/ruby 
    2 
    3 require 'date'. 
    4 
    5 10.times do |t| 
    6 random_year = Random.new.rand(2000..2014) # custom range for years 
    7 random_month =Random.new.rand(1..12) 
    8 random_day = Random.new.rand(1..30) 
    9 puts "#{Date.new(random_year,random_month,random_day)}" 
10 end 

2014-11-29 
2010-10-20 
2006-02-23 
2009-09-17 
2006-01-14 
2009-01-06 
2002-07-06 
2005-11-05 
2013-06-20 
2005-12-02 
1

Вот что-то я использовал для генерации случайных даты рождения при заполнении базы данных клиентов. Он работает в дни, и в этом примере, дает случайные даты между 1967-01-09 и 1993-01-12, используя Date#jd метод:

Date.jd(2439500 + rand(9500)) 

Вы можете вертеть даты, генерируемые при установке базы (в этот случай 2439500, который 1967-01-09), и случайное число для увеличения или уменьшения диапазона дат.

Пример:

irb(main):043:0> 10.times { puts Date.jd(2439500 + rand(9500)) } 
1973-06-07 
1973-11-09 
1983-07-27 
1990-11-03 
1967-06-18 
1967-06-20 
1970-07-28 
1990-05-13 
1986-11-26 
1989-02-15 
+0

Именно то, что я искал! – ardochhigh

Смежные вопросы