2009-12-20 2 views
1

Мне нужно выполнить этот запрос, чтобы узнать следующее значение auto_increment, которое будет использоваться MySQL для конкретной таблицы.Rails find_by_sql - как запускать общие запросы

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] 

Как вызвать данный запрос? Это работает на любой модели, которую я вызываю с возвратом массива размера 1, содержащего объект модели. Изменить: объект содержит хэш с атрибутами, который содержит значение auto_increment по желанию.

Есть ли другие способы запуска таких общих запросов? Хотелось бы узнать, возможно ли изменение всего подхода использования find_by_sql для решения исходной проблемы.

ответ

6

Если вы хотите запустить raw SQL без привлечения модели, вы можете получить непосредственно connection и вызвать один из методов select_* (select_value в этом случае). Эти методы просто принимают инструкцию SQL в виде строки, поэтому вы можете вызвать sanitize_sql_array для преобразования массива параметров (обратите внимание, что sanitize_sql_array защищен, поэтому может потребоваться send).

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])) 

Полученный результат будет строкой.

0

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

Взгляните на #columns [править: заблуждаетесь «атрибуты»] атрибут этого объекта и увидеть, где ActiveRecord поставил результат, который вы ищете (я подозреваю, что это будет под именем столбца AUTO_INCREMENT)

+0

@Ryan: Правильно. Я знаю, как получить необходимый результат из запроса. Я спрашиваю, является ли весь подход вызова этого запроса к конкретной модели правильным, и если есть какой-либо другой способ вызвать метод. Благодаря! –

Смежные вопросы