创建或覆盖Rails Active Record宏

时间:2014-06-13 08:36:52

标签: ruby-on-rails macros timestamp rails-activerecord

在Rails应用程序中,Active Record会创建created_atupdated_at列感谢宏(它似乎也被称为“魔术列”)。

请参阅Active Record Migrations

我对这种机制有一些疑问:

  • 是否可以覆盖它以获取第三列(例如deleted_at)?
  • 是否可以创建一个新的宏t.publishing,例如会创建publish_uppublish_down列?
  • 在哪里编码?

显然,我知道我可以手动添加这些列,但我想知道如何用宏来实现它。

使用Rails 4。

1 个答案:

答案 0 :(得分:4)

ActiveRecord::ConnectionsAdapters::TableDefinition::Table课程负责所有高级迁移工作,例如columnindexindex_exists?等。它具有timestamps方法,可为您添加created_atupdated_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

基本上,你可以用这种方式对它进行monkeypatch(在你的初始化器中的某个地方):

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上的课程source code以获取更多见解。