2009-12-20 55 views
1

我需要執行此查詢來找出MySQL將使用的下一個auto_increment值。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

如果要運行原始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 [編輯:ERR「屬性」]該對象的屬性,看看那裏的ActiveRecord已經把你正在尋找的結果(我懷疑這將是一個名爲AUTO_INCREMENT列下)

+0

@Ryan:正確。我知道如何從查詢中獲得必要的輸出。我所問的是,在特定模型上調用此查詢的整個方法是否正確以及是否有其他方法可以調用此方法。謝謝! – 2009-12-20 14:51:00

相關問題