2011-06-07 1 views
1

Que voulez-vous créer manuellement une requête spéciale non basée sur un modèle particulier? Une colonne ici, une colonne là, peut-être un compte, une somme, ou une autre caluculation. Voici une façon dont je suis venu avec ...Est-ce un bon moyen d'obtenir des données arbitraires de la base de données

>> results = ActiveRecord::Base.connection.execute(
    'SELECT location, count(*) AS count FROM contracts 
    GROUP BY location 
    ORDER BY location') 
=> #<Mysql::Result:0x103197e50> 
>> arr = [] 
=> [] 
>> results.each { |row| arr << [row.first, row.last] } 
=> #<Mysql::Result:0x103197e50> 
>> arr 
=> [[nil, "189"], ["", "4"], ["Canceled", "12"], ["Cancelled", "4"], ["Closed", "1"], ["Contract - Asst", "4"], ["Contracts - Admin", "5"], ["Exec - Operations", "2"], ["Exec - Policy", "1"], ["Executive", "1"], ["Finance", "25"], ["Fully Executed", "3631"], ["General Counsel", "11"], ["On-Hold", "27"], ["Pending Distribution", "2"], ["Pending Signature", "40"], ["Per Stephen W.", "1"], ["Project Manager", "26"], ["Upcoming", "1"]] 

Mais je suis comme le pire programmeur jamais. Comment un bon programmeur le ferait-il?

En particulier, existe-t-il un moyen plus simple d'accéder aux données dans l'objet Mysql::Result? Pourquoi ai-je un Mysql::Result au lieu d'une structure de données généralisée non spécifique à la base de données?

(S'il importe, dans ce cas particulier, je vais utiliser le 2d Array pour remplir un menu de sélection, mais il pourrait être quelque chose.)

+0

S'agit-il des requêtes spécifiques que vous essayez d'exécuter? Si c'est le cas, vous (ou moi, ou un autre répondant) pouvez écrire une chaîne ActiveRecord qui obtiendra les données dont vous avez besoin. –

Répondre

1

Pour exécuter des requêtes SQL personnalisées via ActiveRecord, il y a deux généraux approches:


1) ActiveRecord::Base#find_by_sql (docs)

Exemple (telle que prise à partir de la documentation):

Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date] 
> [#<Post:0x36bff9c @attributes={"first_name"=>"The Cheap Man Buys Twice"}>, ...] 

2) ActiveRecord::Base.connection.select et ActiveRecord::Base.connection.select* (docs)

L'avantage d'utiliser c'est vous revenez Hash régulièrement des objets qui sont faciles à analyser.


REMARQUE IMPORTANTE: assurez-vous désinfectez vos questions avant d'utiliser ces méthodes, sinon vous serez ouvert aux attaques par injection SQL !! (Oui, qui mérite deux points d'exclamation !!)


Modifier: faire jeter un oeil à ActiveRecord's querying support (alimenté par Arel), si vous ne l'avez pas déjà fait. Il y a beaucoup de choses que vous pouvez faire avec ça.

Questions connexes