2013-12-10 32 views
0

表時,我會看到在this ruby on rails tutorial下面的代碼:做什麼| t |創建與軌道

class CreateProducts < ActiveRecord::Migration 
    def change 
    create_table :products do |t| 
     t.string :name 
     t.text :description 

     t.timestamps 
    end 
    end 
end 

我無法弄清楚什麼是什麼「嗎| T |」是爲了。它有什麼好處?

+0

這是一個塊,它是Ruby語言的一個特性。他們基本上是lambda。 –

+0

他們不是lambda。 lambda是lambda。這與'Proc'不同,後者是一個塊的實例:'def x(&b); b.class; end; x {}#=> Proc' – Kaleidoscope

回答

2

您正在向傳遞block(在這種情況下爲匿名方法),並且create_table會讓您返回表定義的實例。當您將塊的第一個參數指定爲t時,您正在捕獲該表的定義。這裏退房來源:

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-create_table

更具體地說:

https://github.com/rails/rails/blob/5a31d6340f0ee9f3ff071206b114c0d0a5e52b8e/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L173

def create_table(table_name, options = {}) 
    td = create_table_definition table_name, options[:temporary], options[:options] 

    # blah blah 

    yield td if block_given? 

    # blah blah 
end 

線184,我們yield該表定義您的匿名函數(block)。這基本上是這樣發生的:

def create_table(table_name, options = {}) 
    td = create_table_definition table_name, options[:temporary], options[:options] 

    # blah blah 

    # YOUR BLOCK 
    td.string :name 
    td.text :description 

    td.timestamps 
    # END BLOCK 

    # blah blah 
end