2015-04-20 5 views
0

Mon but est d'interroger les éléments par leur id_utilisateur, l'année de création et le mois créé. J'utilise sqlite3 en développement et postresql en production sur Heroku.Ruby strftime '% -m' ne fonctionne pas dans la requête

Je veux faire quelque chose comme ceci:

items.where("user_id = '?' AND strftime('%Y', created_at) = '?' AND strftime('%-m', created_at) = '?' ", 6, 2015, 3) 

Mais il ne renvoie aucun enregistrement.

Cela fonctionne:

items.where("user_id = '?' AND strftime('%Y', created_at) = '?' ", 6, 2015) 

Mais ce ne renvoie aucun enregistrement:

items.where("user_id = '?' AND strftime('%-m', created_at) = '?' ", 6, 3) 

Suis-je utiliser le format '%-m' mal?

+2

N'utilisez pas de guillemets pour '?'. Il peut être excusable avec SQLite3; pas en général. Qu'est-ce que le format '% -m'? Je ne l'ai jamais vu et je ne le trouve pas dans [docs] (http://www.sqlite.org/lang_datefunc.html). (Note: vous écrivez SQL, donc c'est SQLite3 'strftime', pas Ruby' strftime'.) – Amadan

+4

Notez que 'strftime' est un SQLite-ism pour contourner le manque de types de temps natifs, cela ne fonctionnera pas à tout avec PostgreSQL. Faites-vous plaisir et installez PostgreSQL localement pour pouvoir développer, tester et déployer avec la même base de données. –

+1

Y at-il une bonne raison pour laquelle vous n'utilisez pas postgresql en développement? Sûrement un problème comme celui-ci souligne pourquoi il peut être vraiment utile d'utiliser la même technologie dans tous vos environnements? – Jon

Répondre

3

Je n'utiliserais pas différentes bases de données en développement et en production, utilisez le même. Il suffit de configurer postgresql sur votre ordinateur local et changer votre requête à quelque chose comme:

user.items.where("date_part('year', created_at) = :year AND date_part('month', created_at) = :month", year: 2015, month: 6) 

C'est en supposant que vous avez les associations entre les éléments et la configuration des utilisateurs, vous n'avez pas besoin d'interroger sur user_id aussi bien.

+0

Cela a fonctionné après la migration vers PostgreSQL. –