Ruby on rails 创建表方法/块

Ruby on rails 创建表方法/块,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我来自java/c++背景,刚开始学习Ruby。我在理解附加到方法的块时遇到问题。这是一种用于迁移数据库的方法 create_table :model_names do |t| t.string :name t.string :address t.timestamps end 我的问题是:当我使用rakedb:migrate命令时。这是否调用create_table方法并向其传递一个TableDefinition对象,我将其抓取为| t |,并在我的块中设置该对象的属性

我来自java/c++背景,刚开始学习Ruby。我在理解附加到方法的块时遇到问题。这是一种用于迁移数据库的方法

create_table :model_names do |t|
    t.string :name
    t.string :address
    t.timestamps
end

我的问题是:当我使用rakedb:migrate命令时。这是否调用create_table方法并向其传递一个TableDefinition对象,我将其抓取为| t |,并在我的块中设置该对象的属性?

当您将块传递给一个方法时,如本例所示,由该方法决定如何以及是否使用该块。您需要阅读该方法的文档和/或源代码,以了解块需要哪些参数(如果有)

create\u table
的情况下,将准备一个对象,并通过
create\u table
方法本身传递给您
rake
和关联的任务在这一点上与之无关,它们仅用作启动机制

重要的是要记住,Ruby块可以被调用零次或多次,无论是立即调用还是将来调用。这意味着您无法确定您的块是否会立即调用、稍后调用或从不调用,或者调用多少次。您可以拥有的唯一期望是通过将块发送到的方法建立的

您甚至可以将块传递给不希望它们发生任何事情的方法,因为该方法从不使用
屈服
来练习块

块一开始可能有点混乱,除非您来自具有类似结构的语言。JavaScript程序员将熟悉传递
函数
对象,这基本上就是您在这里所做的全部工作,尽管用Ruby术语来说,这是一个作为隐式参数发送的过程

在一个更具JavaScript风格的示例中,如下所示:

create_table('model_names', function(t) {
  t.string('name');
  t.string('address');
  t.timestamps();
});
很明显,您只是在发送一个函数,由
create\u table
函数来执行它。Ruby的结构是这样的,乍一看,这个块似乎马上就被执行了,但是用
do声明一个块之间有很大的区别。。。结束和开始。。。结束