创建或覆盖 Rails Active Record 宏

Joc*_*lyn 2 macros timestamp ruby-on-rails rails-activerecord

在Rails应用程序,活动记录创建created_atupdated_at列谢宏,(它似乎也被称为“魔法列”)。

查看Active Record 迁移

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

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

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

4. 在 Rails 上工作

two*_*ves 5

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
Run Code Online (Sandbox Code Playgroud)

基本上,你可以用这种方式(在你的初始值设定项中的某处)进行monkeypatch:

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

这同样适用于创建一个新的宏:

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
Run Code Online (Sandbox Code Playgroud)

之后,您应该能够执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

查看github 上的类源代码以获得更多见解。