Rails find_by_sql - как выполнять общие запросы - PullRequest
1 голос
/ 20 декабря 2009

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

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 для решения исходной проблемы.

Ответы [ 2 ]

6 голосов
/ 20 декабря 2009

Если вы хотите запустить сырой 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 голосов
/ 20 декабря 2009

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

Взгляните на атрибут #columns [edit: err "attribute"] этого объекта и посмотрите, куда ActiveRecord поместил искомый результат (я подозреваю, он будет находиться под столбцом с именем auto_increment)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...