Fichier Rails Active Record find (: all,: order =>)

Il me semble impossible d’utiliser l’option ActiveRecord :: Base.find: commandez plus d’une colonne à la fois.

Par exemple, j’ai un modèle “Show” avec la date et les colonnes de fréquentation.

Si j’exécute le code suivant:

@shows = Show.find(:all, :order => "date") 

Je reçois les résultats suivants:

 [#, #, #, #, #] 

Si j’exécute le code suivant:

 @shows = Show.find(:all, :order => "attending DESC") [#, #, #, #, #] 

Mais si je cours:

 @shows = Show.find(:all, :order => "date, attending DESC") 

OU

 @shows = Show.find(:all, :order => "date, attending ASC") 

OU

 @shows = Show.find(:all, :order => "date ASC, attending DESC") 

Je reçois les mêmes résultats que le sorting par date:

  [#, #, #, #, #] 

Où, comme je veux obtenir ces résultats:

 [#, #, #, #, #] 

Ceci est la requête générée à partir des journaux:

 [4;35;1mUser Load (0.6ms)[0m [0mSELECT * FROM "users" WHERE ("users"."id" = 1) LIMIT 1[0m [4;36;1mShow Load (3.0ms)[0m [0;1mSELECT * FROM "shows" ORDER BY date ASC, attending DESC[0m [4;35;1mUser Load (0.6ms)[0m [0mSELECT * FROM "users" WHERE ("users"."id" = 1) [0m 

Enfin, voici mon modèle:

  create_table "shows", :force => true do |t| t.ssortingng "headliner" t.ssortingng "openers" t.ssortingng "venue" t.date "date" t.text "description" t.datetime "created_at" t.datetime "updated_at" t.decimal "price" t.time "showtime" t.integer "attending", :default => 0 t.ssortingng "time" end 

Qu’est-ce que je rate? Qu’est-ce que je fais mal?

MISE À JOUR: Merci pour toute votre aide, mais il semble que vous ayez tous été déconcertés autant que moi. Ce qui a résolu le problème était de changer de firebase database. Je suis passé de sqlite3 par défaut à mysql.

Je remarque que dans votre premier exemple, le simple : order => “date” , record 7 est sortingé avant l’enregistrement 1 . Cet ordre est également la façon dont vous voyez les résultats dans le sorting multi-colonnes, que vous sortingiez en participant ou non.

Cela me semblerait logique si les dates n’étaient pas exactement les mêmes, et la date du 7 est antérieure à la date du 1 . Au lieu de constater que les dates sont exactement les mêmes, puis que l’on procède au sorting en fonction des participants , la requête constate que les dates ne sont pas égales et sortinge simplement par ordre de priorité comme pour tous les autres enregistrements.

En parcourant ces pages, je constate que SQLite n’a pas une compréhension native des types de données DATE ou DATETIME et que les utilisateurs ont le choix entre des nombres à virgule flottante ou du texte qu’ils doivent parsingr eux-mêmes. Est-il possible que la représentation littérale des dates dans la firebase database ne soit pas exactement égale? La plupart des gens semblent avoir besoin d’ utiliser les fonctions de date pour que les dates se comportent comme vous vous en doutez. Peut-être y a-t-il un moyen d’encapsuler votre commande par colonne avec une fonction de date qui vous donnera quelque chose de concret à comparer, comme la date (date), l’ASC, participant au DESC . Je ne suis pas sûr que la syntaxe fonctionne, mais c’est un domaine à examiner pour résoudre votre problème. J’espère que cela pourra aider.

Pourrait être deux choses. Premier,

Ce code est obsolète:

 Model.find(:all, :order => ...) 

devrait être:

 Model.order(...).all 

Find n’est plus pris en charge avec les options: all,: order et de nombreuses autres options.

Deuxièmement, vous avez peut-être eu un default_scope qui imposait un ordre avant que vous ayez appelé find sur Show .

Des heures de recherche sur Internet m’ont amené à quelques articles utiles pour expliquer le problème:

Le problème est que cette date est un mot clé sqlite3 réservé . J’ai eu un problème similaire avec le temps , également un mot-clé réservé, qui a bien fonctionné dans PostgreSQL, mais pas dans sqlite3. La solution renomme la colonne .

Voir ceci: Sqlite3 activerecord: order => “time DESC” ne sortinge pas

Je viens de rencontrer le même problème, mais je réussis à faire fonctionner ma requête dans SQLite comme ceci:

 @shows = Show.order("datetime(date) ASC, attending DESC") 

J’espère que cela pourrait aider quelqu’un à gagner du temps

n’est-ce pas seulement :order => 'column1 ASC, column2 DESC' ?

Assurez-vous de vérifier le schéma directement au niveau de la firebase database. J’ai déjà été brûlé par cela, où, par exemple, une migration a été écrite pour créer une colonne: datetime, et je l’ai exécutée localement, puis ajusté la migration à une date: avant le déploiement effectif. Ainsi, la firebase database de tout le monde a l’air bien, sauf pour la mienne, et les bogues sont subtils.

Je comprends pourquoi les développeurs de Rails ont utilisé sqlite3 pour une implémentation prête à l’emploi, mais MySQL est tellement plus pratique, à mon humble avis. Je me rends compte que cela dépend de ce que vous construisez pour votre application Rails, mais la plupart des gens vont passer du fichier database.yml par défaut de sqlite3 à MySQL.

Content que tu aies résolu ton problème.

C’est bien que vous ayez trouvé votre solution. Mais c’est un problème intéressant. Je l’ai moi-même essayé directement avec sqlite3 (sans passer par des rails) et je n’ai pas obtenu le même résultat, pour moi la commande est sortie comme prévu.

Ce que je vous suggère de faire si vous voulez continuer à creuser ce problème, c’est de lancer l’application de ligne de commande sqlite3 et de vérifier le schéma et les requêtes:

Cela vous montre le schéma: .schema

Et puis, exécutez simplement l’instruction select telle qu’elle apparaît dans les fichiers journaux: SELECT * FROM "shows" ORDER BY date ASC, attending DESC

De cette façon, vous voyez si:

  1. Le schéma ressemble à ce que vous voulez (cette date est en fait une date par exemple)
  2. Que la colonne date contient réellement une date, et non un horodatage (c’est-à-dire que vous n’avez pas une heure du jour qui perturbe le sorting)

Cela pourrait aussi aider:

 Post.order(created_at: :desc)