2012-01-13 1 views
2

Как бы восстановить следующий запрос в Rails, чтобы он возвращал количество обработанных строк?Mysql to Rails SQL-запрос

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

Я понимаю, что я должен использовать что-то вроде Artist.find_by_sql для того, чтобы вернуть что-то, но это дает мне ошибку.

Возможно, есть более элегантный способ сделать это?

Я хочу, чтобы избежать рельсов пути первого поиска в базе данных, а затем захвата идентификаторов и удалении записей с Object.destroy или даже Object.delete(id) поскольку вызов SQL намного быстрее (если у вас есть правильные индексы), но я Любопытно, что «правильный» способ сделать это.

+0

Ваш запрос кажется неправильным. Вы уже тестировали его непосредственно в своей базе данных? – basgys

ответ

3

Вы просто должны заменить выполнить путем удаления, и он возвращает количество строк.

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

Существует, возможно, более элегантный способ сделать это с ActiveRecord, но я сомневаюсь, что это будет столь же эффективным в качестве исходного запроса SQL.

+0

Спасибо. Так просто используйте delete, а также включите DELETE внутри запроса? Я предполагаю, что 'connection.delete' просто возвращает число затронутых строк (независимо от фактического запроса), а выполнить нет? – kakubei

+0

@kakubei Да, вы должны включить ключевое слово DELETE, потому что запрос не будет анализироваться. Поэтому, если вы поместите инструкцию UPDATE, delete() не увидит никакой разницы (как вы сказали). execute(), однако, вернет результат для операторов select и nil для insert/update/delete. – basgys

+0

Большое спасибо, это действительно хорошо знать. – kakubei