2016-05-19 3 views
1

Я хотел бы добавить комментарии к объектам, таким как сама база данных, таблицы и т. Д., Используя грабли. Например, когда я выполняю rake db:create Я хотел бы автомагический добавить комментарий с помощью PostgreSQL расширенного заявления SQL (если адаптер не поддерживает это непосредственно), какКак добавить комментарии PostgreSQL к объектам с рельсами/рейком?

COMMENT ON DATABASE myapp_development IS 'Rails DB for project at c:/some/path/myapp/'; 

Я хотел бы подобное поведение для ActiveRecord :: Миграция, если возможно (путем извлечения RDoc?) Для таблиц и столбцов.

Мне кажется, что это может быть скорее как запрос функции, чем нечто, что можно сделать быстро. Возможно ли это сделать, и как я могу это сделать?

ответ

1

Вы должны иметь возможность просто выполнить необработанный SQL, где он вам нужен. Попробуйте это:

sql = "COMMENT ON DATABASE myapp_development IS 'Rails DB for project at c:/some/path/myapp/';" 
records_array = ActiveRecord::Base.connection.execute(sql) 

Обратите внимание, что вы можете использовать интерполяцию строки (например, "#{value}"), чтобы включить значения переменных, если вам нужно. У вас есть все выразительные возможности Ruby и возможность запуска любого родного SQL, который вам нужен.

Драгоценный камень MigrationComments дает встроенную поддержку комментариев по объектам миграции. Чтобы установить его, просто добавьте в ваш Gemfile:

gem 'migration_comments' 

После установки, вы можете включать как встроенные комментарии:

def self.up 
    create_table :users, comment: "User records are stored in this table." do |t| 
    t.string :canonical_email, comment: "This column contains the email address that has been URL decoded and lowercased, to ensure system-wide uniqueness" 
    end 
end 

и автономные комментарий изменения:

def self.up 
    change_table :users do |t| 
    t.comment "User records are stored in this table." 
    t.change_comment :canonical_email, "This column contains the email address that has been URL decoded and lowercased, to ensure system-wide uniqueness" 
    end 
end 

Вы можете найти драгоценный камень PgComment, который даст вам комментарий с синтаксисом ActiveRecord. Просто добавьте это к вашему Gemfile:

gem 'pg_comment' 

И вы сможете делать классные вещи, как это:

set_table_comment :users, "User records are stored in this table." 
set_column_comment(:users, :canonical_email, "This column contains the email address that has been URL decoded and lowercased, to ensure system-wide uniqueness") 

К сожалению, нет нет set_database_comment с любой драгоценный камень, поэтому комментарии базы данных (и другие неподдерживаемый Объекты Postgres) потребует использования необработанного SQL-решения, показанного в верхней части ответа.

+0

Где я положил все это срабатывать от 'грабли БД: create'? – mlt

+0

Отличный вопрос. Вы действительно можете сделать это из-за миграции. Итак, ваша первая миграция может заставить это прокомментировать базу данных, а затем начать создавать таблицы. –

+0

Ух! Это может сработать. Но кажется слишком сложным добавить такой код при каждом переносе вручную. Я бы предпочел обернуть его в драгоценный камень и заставить его подключиться к миграции, если что-то подобное возможно. – mlt

1

Оказалось, что это проще, чем я думал. Можно создать ./lib/tasks/annotate_db.rake, например, из Rails template file, со следующим содержанием

namespace :db do 
    def update_db_comment 
    Rails.configuration.database_configuration.each do |key, hash| 
     db = hash['database'] 
     if not db.nil? 
     sql = "COMMENT ON DATABASE #{db} IS 'Rails #{Rails::VERSION::STRING} #{key} DB for project at #{Rails.root} on #{Socket.gethostbyname(Socket.gethostname).first}';" 
     # puts sql 
     records_array = ActiveRecord::Base.connection.execute(sql) 
     end 
    end 
    end 

    task :create do 
    update_db_comment 
    end 
end 

# Rake::Task['db:create'].enhance(['db:set_db_comment'])