2009-12-20 6 views
1

J'ai besoin d'exécuter cette requête pour trouver la prochaine valeur auto_increment qui sera utilisée par MySQL pour une table particulière.Rails find_by_sql - comment lancer des requêtes génériques

find_by_sql ["select auto_increment from information_schema.tables where 
table_schema = ? and table_name = ? and auto_increment is not null", db_name, tbl_name] 

Comment appeler cette requête particulière? Cela fonctionne sur n'importe quel modèle que je l'invoque en retournant un tableau de taille 1 contenant l'objet du modèle. Edit: l'objet contient un hachage nommé attributes qui contient la valeur auto_increment comme souhaité.

Existe-t-il d'autres moyens d'exécuter ces requêtes génériques? Je voudrais savoir si un changement dans l'approche globale de l'utilisation de find_by_sql est également possible pour résoudre le problème original.

Répondre

6

Si vous souhaitez exécuter du code SQL brut sans impliquer un modèle, vous pouvez obtenir le connection directement et appeler l'une des méthodes select_* (select_value dans ce cas). Ces méthodes prennent simplement une instruction SQL sous forme de chaîne, vous pouvez donc appeler sanitize_sql_array pour transformer votre tableau de paramètres (notez que sanitize_sql_array est protégé, donc send peut être requis).

ActiveRecord::Base.connection.select_value(
    ActiveRecord::Base.send(:sanitize_sql_array, 
    ["select auto_increment from information_schema.tables where 
    table_schema = ? and table_name = ? and auto_increment is not null", 
    db_name, tbl_name])) 

Le résultat renvoyé sera une chaîne.

0

Donc ce tableau contenant un objet du modèle est en fait ActiveRecord essayant de convertir les résultats de votre requête en un objet.

Jetez un oeil à la #columns [edit: err « attributs »] attribut de cet objet et de voir où ActiveRecord a mis le résultat que vous êtes à la recherche (je soupçonne que ce sera sous une colonne auto_increment nommée)

+0

@Ryan: Correct. Je connais le moyen d'obtenir la sortie nécessaire de la requête. Ce que je demande, c'est si toute l'approche d'appeler cette requête sur un modèle particulier est correcte et s'il y a un autre moyen d'invoquer la méthode. Merci! –

Questions connexes