J'ai un modèle dans mon application Rails 3 qui a un champ date
:
class CreateJobs < ActiveRecord::Migration
def self.up
create_table :jobs do |t|
t.date "job_date", :null => false
...
t.timestamps
end
end
...
end
Je voudrais pré-remplir ma base de données avec des valeurs de date aléatoires.
Quel est le moyen le plus simple de générer une date aléatoire?
Voici une légère extension de la réponse de Chris, avec les paramètres optionnels from
et to
:
def time_Rand from = 0.0, to = Time.now
Time.at(from + Rand * (to.to_f - from.to_f))
end
> time_Rand
=> 1977-11-02 04:42:02 0100
> time_Rand Time.local(2010, 1, 1)
=> 2010-07-17 00:22:42 0200
> time_Rand Time.local(2010, 1, 1), Time.local(2010, 7, 1)
=> 2010-06-28 06:44:27 0200
Essaye ça:
Time.at(Rand * Time.now.to_i)
Rand(Date.civil(1990, 1, 1)..Date.civil(2050, 12, 31))
ma méthode préférée
def random_date_in_year(year)
return Rand(Date.civil(year.min, 1, 1)..Date.civil(year.max, 12, 31)) if year.kind_of?(Range)
Rand(Date.civil(year, 1, 1)..Date.civil(year, 12, 31))
end
puis utiliser comme
random_date = random_date_in_year(2000..2020)
Rester simple ..
Date.today-Rand(10000) #for previous dates
Date.today+Rand(10000) #for future dates
PS En augmentant/diminuant le paramètre '10000', change la plage de dates disponibles.
Pour les versions récentes de Ruby/Rails, vous pouvez utiliser Rand
sur une plage Time
!!
min_date = Time.now - 8.years
max_date = Time.now - 1.year
Rand(min_date..max_date)
# => "2009-12-21T15:15:17.162+01:00" (Time)
N'hésitez pas à ajouter to_date
, to_datetime
, etc. pour convertir votre classe préférée
Testé sur Rails 5.0.3 et Ruby 2.3.3, mais apparemment disponible sur Ruby 1.9+ et Rails 3+
Voici également une version améliorée (à mon avis) du fragment de code de Mladen. Heureusement, la fonction Rand () de Ruby peut également gérer les objets de temps. En ce qui concerne l'objet Date est défini lors de l'inclusion de Rails, la méthode Rand () est écrasée afin de pouvoir également gérer les objets Date. par exemple.:
# works even with basic Ruby
def random_time from = Time.at(0.0), to = Time.now
Rand(from..to)
end
# works only with Rails. syntax is quite similar to time method above :)
def random_date from = Date.new(1970), to = Time.now.to_date
Rand(from..to)
end
Edit: ce code ne fonctionnera pas avant Ruby v1.9.3
Voici mon seul article pour générer une date aléatoire au cours des 30 derniers jours (par exemple):
Time.now - (0..30).to_a.sample.days - (0..24).to_a.sample.hours
Fonctionne très bien pour mon lorem ipsum. Évidemment, les minutes et les secondes seraient corrigées.
Ce qui suit renvoie une date-heure aléatoire au cours des 3 dernières semaines en Ruby (sans Rails).
DateTime.now - (Rand * 21)
Puisque vous utilisez Rails, vous pouvez installer la gemme faker
et utiliser le module Faker :: Date .
par exemple. Ce qui suit génère une date aléatoire en 2018:
Faker::Date.between(Date.parse('01/01/2018'), Date.parse('31/12/2018'))
La réponse de Mladen est un peu difficile à comprendre d'un simple regard. Voici mon point de vue sur ceci.
def time_Rand from=0, to= Time.now
Time.at(Rand(from.to_i..to.to_i))
end