2010-09-02 7 views
6

Me gustaría insertar COMMENT, que es parte del comando SQL, en mis archivos de migración.¿Algún plugin de Rails para agregar comentarios sobre cada columna en los archivos de migración de ActiveRecord?

As far as I know, I can add COMMENT to each table and column.

No puedo recordar el nombre de plug-in que permite a mí escribir de la siguiente manera:

t.string :name, :comment => "A user's fullname" 
    t.string :label, :comment => "name of color" 
    t.text :value, :comment => "self intro" 
    t.integer :position, :comment => "1 is left, 2 is right" 

Y esa declaración mágicamente se traduce en SQL, que es como

create table test (
    name varchar(255) not null COMMENT 'blahblah', 
    label varchar(255) null COMMENT 'hahaha' 
    text varchar(255) not null, 
    position int(11) 
); 

¿Alguien sabe el nombre del complemento?


  • No estoy buscando Annotate Models plugins por Dave Thomas. Lo que quiero decir con comentarios es dentro de las consultas de MySQL.

Respuesta

5

No conozco ningún plugin que logre lo que estás pidiendo. Usted podría ser capaz de hackear lo que desea al mirar ActiveRecord::ConnectionAdapters::ColumnDefinition. (Ver active_record/connection_adapters/abstract/schema_definitions.rb.)

Como se puede ver la Struct define las distintas opciones de columna (como :limit y :default.) Se podría extendida que con una estructura :comment y luego modificar #to_sql para generar el SQL necesario. También necesitaría modificar TableDefinition#column para establecer el atributo :comment.

El siguiente ha sido probado y obras (para MySQL):

module ActiveRecord 
    module ConnectionAdapters 
    class ColumnDefinition 
     attr_accessor :comment 

     def to_sql_with_comment 
     column_sql = to_sql_without_comment 
     return column_sql if comment.nil? 
     "#{column_sql} COMMENT '#{base.quote_string(comment)}'" 
     end 

     alias_method_chain :to_sql, :comment 
    end 

    class TableDefinition 
     # Completely replaces (and duplicates the existing code, but there's 
     # no place to really hook into the middle of this.) 
     def column(name, type, options = {}) 
     column = self[name] || ColumnDefinition.new(@base, name, type) 
     if options[:limit] 
      column.limit = options[:limit] 
     elsif native[type.to_sym].is_a?(Hash) 
      column.limit = native[type.to_sym][:limit] 
     end 
     column.precision = options[:precision] 
     column.scale = options[:scale] 
     column.default = options[:default] 
     column.null = options[:null] 
     column.comment = options[:comment] 
     @columns << column unless @columns.include? column 
     self 
     end 
    end 
    end 
end 
+0

Gracias! Tu respuesta es asombrosa No he probado tu código, tampoco. Pero tomaré tu enfoque. –

+0

Parece que el código no funciona. –

+0

¿Qué pieza no funciona? ¿Agregó algún registro para ver si se están llamando a los métodos? – rjk

6

Enchufe desvergonzado - ahora hay un 'migration_comments' joya que trabaja para comentar MySQL, SQLite y PostgreSQL. Es compatible con Rails 2.3 y superior en este momento. También funciona junto con la gema annotate (v2.5.0 o superior) para generar estos comentarios en sus archivos Modelo/Fixture/Spec.

+0

¡genial! Prefiero las gemas a escribir el código para mí. –

1

Después de un error al conseguir que migration_comments gem funcione para Oracle, intenté lo siguiente con activerecord -v 4.1.1 y el comentario se agregó correctamente. Así que no hay más necesidad de gemas adicionales.

ActiveRecord::Schema.define do 
    create_table TABLENAME do |table| 
     table.column :status, :integer, :comment => "Keeps status for this signal" 
     table.column :rowversion, :integer, :comment => "Increments with each change of this record" 
     etc.. 
    end 
    end 
0

Con Rails 5, ahora puede agregar directamente comentarios a su migración sin usar ningún complemento.

Puede agregar comentarios para tabla, columna e índice.

Puede ver estos comentarios en schema.rb plus desde la herramienta DBA.

Ejemplo:

class CreateProducts < ActiveRecord::Migration[5.0] 
    def change 
    create_table :products, comment: 'Products table' do |t| 
     t.string :name, comment: 'Name of the product' 
     t.string :barcode, comment: 'Barcode of the product' 
     t.string :description, comment: 'Product details' 
     t.float :msrp, comment: 'Maximum Retail Price' 
     t.float :our_price, comment: 'Selling price' 

     t.timestamps 
    end 

    add_index :products, :name, name: 'index_products_on_name', unique: true, comment: 'Index used to lookup product by name.' 
    end 
end 

Nota: Esto sólo se admite para PostgreSQL y MySQL.

Cuestiones relacionadas