2014-06-13 89 views
2

在Rails應用程序中,Active Record創建了created_atupdated_at列,感謝宏(它似乎也稱爲「魔術列」)。創建或覆蓋Rails Active Record宏

Active Record Migrations

我有關於mecanism一些問題:

  • 是否有可能重寫獲得第三列(例如deleted_at)?
  • 是否有可能創建一個新的宏t.publishing,它將創建​​和publish_down列,例如?
  • 並在哪裏編碼?

很明顯,我知道我可以手動添加這些列,但我不知道如何用宏實現它。

工作on Rails的4

回答

3

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 

基本上,你可以(在你的初始化某處)這樣猴補丁吧:

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瞭解更多見解。

+0

謝謝你的幫助。我通過monkeypatching TableDefinition類來工作https://gist.github.com/jocelynduc/3a34478ed3e7da3a0dcb – Jocelyn