2009-12-20 3 views
1

특정 테이블에 대해 MySQL이 사용할 다음 auto_increment 값을 찾으려면이 쿼리를 실행해야합니다. 레일 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

모델을 포함하지 않고 원시 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를 살펴 보자 [편집 : "속성"잘못] 객체의 속성 및 액티브 당신이 찾고있는 결과를 걸었다 곳 (나는 그것이 열 이름 AUTO_INCREMENT 아래에있을 것입니다 의심)를 참조하십시오

+0

@ 라이언 : 수정. 쿼리에서 필요한 출력을 얻는 방법을 알고 있습니다. 필자가 묻는 것은 특정 모델에 대해이 쿼리를 호출하는 전체적인 접근 방식이 올바른지 여부와 메서드를 호출 할 다른 방법이 있는지 여부입니다. 감사! –