Любой плагин Rails, чтобы добавить комментарии о каждом столбце в файлах миграции ActiveRecord? - PullRequest
6 голосов
/ 02 сентября 2010

Я хотел бы вставить COMMENT, который является частью команды SQL, в мои файлы миграции.

Насколько я знаю, я могу добавить КОММЕНТАРИЙ к каждой таблице и столбцу.

Я не могу вспомнить название плагина, который позволяет мне писать следующим образом:

    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"

И это утверждение волшебным образом переводится в SQL, что похоже на

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

Кто-нибудь знает имя подключаемого модуля?


  • Я не ищу Плагины Annotate Models от Dave Thomas. То, что я имею в виду под комментариями, находится внутри запросов MySQL.

Ответы [ 4 ]

6 голосов
/ 21 сентября 2012

Бесстыдный плагин - теперь есть гем igration_comments , который работает для комментирования MySQL, SQLite и PostgreSQL. В настоящее время он поддерживает Rails 2.3 и выше. Он также работает вместе с annotate gem (v2.5.0 или выше), чтобы генерировать эти комментарии в ваших файлах Model / Fixture / Spec.

5 голосов
/ 03 сентября 2010

Я не знаю ни одного плагина, который бы выполнил то, что вы просите.Вы можете иметь возможность взломать то, что вы хотите, посмотрев на ActiveRecord::ConnectionAdapters::ColumnDefinition.(См. active_record/connection_adapters/abstract/schema_definitions.rb.)

Как видите, Struct определяет различные параметры столбцов (например, :limit и :default.). Вы можете расширить эту структуру с помощью :comment, а затем изменить#to_sql для генерации необходимого SQL.Вам также необходимо изменить TableDefinition#column для установки атрибута :comment.

Следующее было протестировано и работает (для 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
1 голос
/ 26 мая 2016

С Rails 5 вы можете напрямую добавлять комментарии к своей миграции без использования какого-либо плагина.

Вы можете добавить комментарии для таблицы, столбца и индекса.

Вы можете просмотреть эти комментарии в schema.rb plus из инструмента DBA.

Пример:

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

Примечание. Это поддерживается только для PostgreSQL и MySQL.

1 голос
/ 10 июля 2015

После сбоя, заставившего gem_comments работать на Oracle, я просто попробовал следующее с activerecord -v 4.1.1, и комментарий был добавлен правильно. Поэтому больше не нужно дополнительных драгоценных камней.

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...