Создание или переопределение макросов Rails Active Record

В приложении Rails Active Record создает столбцы created_at и updated_at благодаря макросам (похоже, их также называют «магическими столбцами»).

См. раздел Миграция Active Record.

У меня есть несколько вопросов об этом механизме:

  • Можно ли переопределить это, чтобы получить третий столбец (например, deleted_at)?
  • Можно ли создать новый макрос t.publishing, который создаст, например, столбцы publish_up и publish_down?
  • И где это закодировать?

Очевидно, я знаю, что могу добавить эти столбцы вручную, но мне интересно, как это сделать с помощью макросов.

Работа на Рельс 4.


person Jocelyn    schedule 13.06.2014    source источник


Ответы (1)


Класс ActiveRecord::ConnectionsAdapters::TableDefinition::Table отвечает за все высокоуровневые миграции, такие как column, index, index_exists? и так далее. Он имеет метод timestamps, который добавляет для вас столбцы created_at и updated_at:

  # Adds timestamps (+created_at+ and +updated_at+) columns to the table. 
  # See SchemaStatements#add_timestamps
  # t.timestamps
  def timestamps
    @base.add_timestamps(@table_name)
  end

По сути, вы можете исправить это таким образом (где-то в ваших инициализаторах):

class ActiveRecord::ConnectionsAdapters::TableDefinition::Table
  def timestamps
    @base.add_timestamps(@table_name)
    @base.add_column(@table_name, :deleted_at, :datetime)
  end
end

То же самое относится и к созданию нового макроса:

class ActiveRecord::ConnectionsAdapters::TableDefinition::Table
  def publishing
    @base.add_column(@table_name, :publish_up, :datetime)
    @base.add_column(@table_name, :publish_down, :datetime)
  end
end

После этого вы сможете делать следующие вещи:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :first_name
      t.string :last_name
      t.timestamps
      t.publishing
    end
  end

  def self.down
    drop_table :users
  end
end

Ознакомьтесь с исходным кодом на github для получения дополнительной информации.

person twonegatives    schedule 13.06.2014
comment
Спасибо за помощь. У меня все заработало, исправив класс TableDefinition с помощью обезьяны - person Jocelyn; 13.06.2014