| t |的含义在Ruby的create_table中

时间:2018-06-07 03:57:51

标签: ruby rails-activerecord

以下Ruby代码块中|t|引用了什么?

create_table :products do |t|
  t.string :name
end

3 个答案:

答案 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

使用SQLite3数据库的Rails中的

t.class #=> ActiveRecord::ConnectionAdapters::SQLite3::TableDefinition