Comment dois-je faire? De modèle.où(“created_at >= #{Temps.maintenant - 5.jours}”)
Ce qui a été m'énerve un peu...
Comment puis-je chaîne d'interpoler un datetime
dans les Rails ActiveRecord requêtes?
# Works, but supeh ugleh:
Model.where("created_at >= ?", Time.now - 5.days)
# How do I do this?
Model.where("created_at >= #{Time.now - 5.days}")
# As is, it produces the following error message:
# ActiveRecord::StatementInvalid: PG::Error: ERROR: syntax error at or near ...
La raison pour laquelle je prends soin de la lisibilité du code:
# I like this better:
Model.where("created_at >= #{Time.now - 5.days} OR" + \
"updated_at >= #{Time.now - 3.days}")
# than this:
Model.where("created_at >= ? OR updated_at >= ?", Time.now - 5.days, Time.now - 3.days)
OriginalL'auteur thewillcole | 2012-03-17
Vous devez vous connecter pour publier un commentaire.
Je vous le déconseille l'aide de la chaîne d'interpolation pour cela, il existe de nombreux arêtes vives et vous aurez probablement plus de plaisir bobbing pour les pommes dans un seau d'hameçons. Vous devriez le faire de cette façon:
À l'aide de (bien) nommé espaces réservés vous donne de la lisibilité et de la position de l'indépendance que vous pensez de la chaîne d'interpolation, mais propose gentiment de côté le citant, le fuseau horaire et le format des questions de la chaîne d'interpolation des forces sur vous.
Mais comment voulez-vous utiliser en toute sécurité de la chaîne d'interpolation? Il ya quelques choses que vous devez gérer vous-même:
ActiveRecord prendra soin de tout ce non-sens pour vous.
Ne pas essayer de faire le citant vous-même, utilisez le pilote de l'citant des méthodes. Vous aurez accès à
connection.quote
pour correctement citant les chaînes.Une base de données de savoir quoi faire avec ISO 8601 horodateurs et il est un moyen pratique
iso8601
méthode pour cela. ISO 8601 aussi idéalement comprend le fuseau horaire et la base de données doit être en mesure d'analyser que (mais si elle ne peut pas, alors vous aurez à convertir votre temps à l'UTC à la main avec.utc
).Donc, pour être sûr:
Pas assez il est maintenant? Avec la norme ISO 8601 des horodateurs, vous devriez être sûr de remplacer le
connection.quote
appels avec de simples apostrophes:mais vous avez encore beaucoup de bruit et de la laideur et vous serez le développement de mauvaises habitudes.
Nous ne sommes pas la fête comme un développeur PHP en 1999, afin de ne pas céder à faux la paresse par l'aide de la chaîne d'interpolation dans votre SQL, utiliser des marqueurs nommés.
"bobbing pour les pommes dans un seau d'hameçons" épique
OriginalL'auteur mu is too short
Vieille question, mais ma méthode privilégiée est:
Beaucoup plus joli et plus lisible.
Aussi, Rails 3.2 introduit certaines de Soutien Actif, méthodes d'aide à avoir un peu des plages,
Time#all_day
,Time#all_week
,Time#all_quarter
etTime#all_year
, de sorte que vous pouvez par exemple faire:OriginalL'auteur Mike Campbell