2009-10-11 10 views
2

Hey les gars, j'essaie de sélectionner des données aléatoires de la base de données dans Ruby on Rails. Malheureusement, sqlite et mysql utilisent des noms différents pour la fonction "random". Mysql utilise rand(), sqlite use random(). J'ai été plutôt content d'utiliser sqlite dans mes environnements de développement et je ne veux pas abandonner pour ça.Sélection aléatoire dans les rails sqlite vs mysql

J'ai donc une solution pour cela, mais je ne suis pas très content. Premièrement, y a-t-il une abstraction plus propre dans RoR pour obtenir la fonction aléatoire? Et sinon, est-ce la meilleure façon d'obtenir le "adaptateur"?

# FIXME: There has to be a better way... 
adapter = Rails.configuration.database_configuration[Rails.configuration.environment]["adapter"] 
if adapter == "sqlite3" 
    # sqllite calls it rand 
    random = "random" 
else 
    # mysql calls it rand 
    random = "rand" 
end 

query.push("SELECT *, (" + random + "() * (0.1 * value)) AS weighted_random_value...") 

Répondre

8

Vous pouvez effectivement alias rand() de MySQL à la norme random() en créant une fonction:

CREATE FUNCTION random() RETURNS FLOAT NO SQL SQL SECURITY INVOKER RETURN rand(); 
1

je suis tombé sur ce problème lors de l'élaboration localement SQLite. Malheureusement, ce n'est pas la seule différence entre les bases de données que vous allez rencontrer (les booléens sont également gérés différemment par exemple).

Est-il nécessaire de prendre en charge à la fois SQLite et MySQL? Sinon, je recommande de passer à une base de données unique: celle sur laquelle vous déployez en production.

Cela prend un peu plus de temps à mettre en place mais à mon humble avis à long terme, il vous fera gagner du temps, et vous aurez confiance que votre application fonctionne bien sur la base de données avec laquelle vous allez le déployer.