2010-08-21 19 views
0

Avec Rails/ActiveRecord 2.3.8 Je voudrais faire:activerecord create_table comme table existante

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

Mais AR insiste sur l'ajout «() » à la même SQL généré si la liste des champs est vide depuis la table est cloné DDL, entraînant ainsi par exemple:

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 

est-il possible de contraindre AR pour générer cette create table simple, nouvelle déclaration like existing?

Outre évidemment connection.execute(string)?

Répondre

1

Non. La parenthèse sont fixés dans 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 

Il n'y a rien de mal à utiliser l'exécution sur une chaîne littérale; Je ferais cela si vous n'avez pas envie d'écrire un patch rapide.