activerecord create_table как существующая таблица - PullRequest
0 голосов
/ 22 августа 2010

С Rails / ActiveRecord 2.3.8 я бы хотел сделать:

AnyModel.connection.create_table( 'temp_any_model', temporary: true, id: false, options: 'like any_model' )

Но AR настаивает на добавлении «()» к сгенерированному SQL, даже если список полей пуст, поскольку таблица DDL клонируется, что приводит, например, к следующему примеру:

ActiveRecord::StatementInvalid: Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') like any_model' at line 1: 
CREATE TEMPORARY TABLE `temp_any_model` () like any_model

Есть ли способ заставить AR генерировать этот простой create table новый like existing оператор?

Кроме, очевидно, connection.execute(string)?

1 Ответ

2 голосов
/ 23 августа 2010

Неа. Скобки жестко закодированы в create_table:

def create_table(table_name, options = {})
  # snipped ...

  create_sql = "CREATE#{' TEMPORARY' if options[:temporary]} TABLE "            
  create_sql << "#{quote_table_name(table_name)} ("                             
  create_sql << table_definition.to_sql                                         
  create_sql << ") #{options[:options]}"                                        
  execute create_sql        
end

Нет ничего плохого в использовании execute для строкового литерала; Я бы сделал это, если вы не хотите писать быстрый патч.

...