2012-01-13 4 views
2

Comment est-ce que je recréerais la requête suivante dans Rails parler afin qu'elle renvoie la quantité de lignes traitées?Requête SQL Mysql to Rails

self.connection.execute('DELETE FROM `cd_artist` 
LEFT JOIN `cdpedia` ON cd_artist.id = cdpedia.`artistId` 
WHERE artistId IS NULL;') 

Je me rends compte que je devrais utiliser quelque chose comme Artist.find_by_sql pour elle de retourner quelque chose, mais cela me donne une erreur.

Peut-être y a-t-il une façon plus élégante de faire cela?

Je veux éviter les Rails moyen de la première recherche dans la base de données, puis récupérer les cartes d'identité et de supprimer les entrées avec Object.destroy ou même Object.delete(id) depuis un appel SQL est beaucoup plus rapide (si vous avez les index droit), mais je Je suis curieux de savoir quelle est la "bonne" façon de le faire.

+0

Votre requête semble être erronée. Avez-vous déjà testé directement sur votre base de données? – basgys

Répondre

3

Il vous suffit de remplacer par executesupprimer, et il retournera le nombre de lignes affectées.

self.connection.delete('DELETE FROM `cd_artist` 
LEFT JOIN `cdpedia` ON cd_artist.id = cdpedia.`artistId` 
WHERE artistId IS NULL;') 

Il est peut-être une façon plus élégante de le faire avec ActiveRecord, mais je doute qu'il sera aussi efficace comme des requêtes SQL.

+0

Merci. Il suffit donc d'utiliser delete et d'inclure le DELETE dans la requête? Je suppose que 'connection.delete' renvoie simplement le nombre de lignes affectées (indépendamment de la requête réelle) et que execute ne le fait pas? – kakubei

+0

@kakubei Oui, vous devez inclure le mot-clé DELETE car la requête ne sera pas analysée. Donc, si vous mettez une instruction UPDATE, delete() ne verra aucune différence (comme vous l'avez dit). execute() renvoie cependant un résultat pour les instructions select et nul pour insert/update/delete. – basgys

+0

Merci beaucoup, c'est vraiment bon à savoir. – kakubei