以下Ruby代码块中|t|
引用了什么?
create_table :products do |t|
t.string :name
end
答案 0 :(得分:1)
您可以认为它类似于编写您的迁移:
Edit
方法t = TableCreator.new
t.table_name = 'products'
t.string 'name'
t.save
已在Rails迁移器中定义为:
create_table
这使您的迁移看起来像:
def create_table(name)
creator = TableCreator.new(db_connection: current_connection)
creator.table_name = name
yield creator # this is the line that creates the |t| in your question
t.save
end
您写作时更加漂亮和简单,因为您不必自己致电create_table :products do |t|
t.string :name
end
。
将其称为.save
完全取决于您,它只是一个本地名称。你也可以写:
t
意见:这是非常基本的" Hello World!" -level Ruby,你可能想学习一些语言基础知识,然后再深入研究像Rails这样复杂的东西。
答案 1 :(得分:0)
Google ruby block yield
。
在create_table
内,某人构建了t = TableDef.new
或类似内容,然后调用yield(t)
。这会将对象传递到块中,以便使用块内的行。
答案 2 :(得分:0)
Rails实际上比这更复杂,但也许这可以给出一个想法:
def create_table(table)
p table
p yield table
end
create_table 'products' do |t|
t.insert t.size, '_table'
end
#=> "products"
#=> "products_table"
为了简短起见,我使用String类调用'products'上的方法insert。 但是如果你想深入挖掘rails来源:create_table
在此示例中 t.class #=> String
。
t.class #=> ActiveRecord::ConnectionAdapters::SQLite3::TableDefinition
。