77 votes

ActiveRecord Rechercher par année, jour ou mois sur un champ Date

J'ai un modèle ActiveRecord qui a un attribut de date. Est-il possible d'utiliser cet attribut de date pour rechercher par année, jour et mois :

 Model.find_by_year(2012)
Model.find_by_month(12)
Model.find_by_day(1)

ou est-il simplement possible de find_by_date(2012-12-1).

J'espérais pouvoir éviter de créer des attributs Année, Mois et Jour.

34voto

BSB Points 188

Version indépendante de la base de données...

 def self.by_year(year)
  dt = DateTime.new(year)
  boy = dt.beginning_of_year
  eoy = dt.end_of_year
  where("published_at >= ? and published_at <= ?", boy, eoy)
end

12voto

张健健 Points 708

Dans votre modèle :

 scope :by_year, lambda { |year| where('extract(year from created_at) = ?', year) }

Dans votre contrôleur :

 @courses = Course.by_year(params[:year])

11voto

Beena Shetty Points 904

Pour MySQL, essayez ceci

 Model.where("MONTH(date_column) = 12")
Model.where("YEAR(date_column) = 2012")
Model.where("DAY(date_column) = 24")

5voto

Veraticus Points 10078

Je pense que la façon la plus simple de le faire est une portée:

 scope :date, lambda {|date| where('date_field > ? AND date_field < ?', DateTime.parse(date).beginning_of_day, DateTime.parse(date).end_of_day}

Utilisez-le comme ceci :

 Model.date('2012-12-1').all

Cela renverra tous les modèles avec un champ date entre le début et la fin de la journée pour la date que vous envoyez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X