1

このクエリを実行して、MySQLが特定のテーブルに使用する次のauto_increment値を見つける必要があります。

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値を含むattributesという名前のハッシュが含まれています。

そのような一般的なクエリを実行する他の方法はありますか?find_by_sqlを使用するアプローチ全体を変更して、元の問題も解決できるかどうかを知りたい。

4

2 に答える 2

6

モデルを使用せずに生の SQL を実行する場合は、 を直接取得してメソッドconnectionの 1 つを呼び出すことができます (この場合)。これらのメソッドは SQL ステートメントを文字列として受け取るだけなので、呼び出してパラメーター配列を変換できます (保護されているため、必要になる場合があることに注意してください)。select_*select_valuesanitize_sql_arraysanitize_sql_arraysend

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

返される結果は文字列になります。

于 2009-12-20T15:31:50.613 に答える
0

そのため、モデルの1つのオブジェクトを含む配列は、実際にはActiveRecordがクエリの結果をオブジェクトに変換しようとしています。

そのオブジェクトの#columns[edit:err "attributes"]属性を見て、ActiveRecordが探している結果をどこに置いたかを確認します(auto_incrementという名前の列の下にあると思われます)

于 2009-12-20T14:46:40.987 に答える