46 votes

Comment spécifier une condition inférieure à aujourd'hui à une date dans Rails ActiveRecord

J'essaie de comprendre comment extraire tous les enregistrements de mon ensemble où leurs champs publish sont vrais et expires sont inférieurs à ceux d'aujourd'hui. J'ai ce qui suit mais je ne pense pas que la partie inférieure fonctionne, quelqu'un peut-il m'indiquer la bonne voie s'il vous plaît ?

 Announcement.where(publish: true, :expires < Date.today)

Merci d'avance pour votre aide

65voto

leonardoborges Points 3306

Essaye ça:

 Announcement.where("publish = ? AND expires < ?", true, Date.today)

34voto

wycleffsean Points 677

Étant donné que cela apparaît en premier sur Google, j'ai pensé que je devais intervenir. Il est probablement préférable de s'appuyer sur Arel dans ces circonstances.

 expires = Announcement.arel_table[:expires]
@announcements = Announcement.where(:publish => true)
  .where(expires.lt(Date.today))

Cela va construire la requête SQL suivante

 -- Using Arel
SELECT "announcements".* FROM "announcements" 
WHERE "announcements"."publish" = 't' 
  AND ("announcements"."expires" < '2016-02-03 18:41:26.454325')

-- Contrast that with the string binding method mentioned above
SELECT "announcements".* FROM "announcements"
WHERE (publish = 't' AND expires < '2016-02-03 18:41:26.454325')

Les noms de colonnes sont entièrement qualifiés, vous éviterez ainsi les conflits lors de la composition d'autres requêtes au-dessus de cet ActiveRecord::Relation, c'est-à-dire @announcements

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