命令
rails generate scaffold Post name:string title:string content:text
生成了以下20101109001203_create_posts.rb
文件:
class CreatePosts < ActiveRecord::Migration
def self.up
create_table :posts do |t|
t.string :name
t.string :title
t.text :content
t.timestamps
end
end
def self.down
drop_table :posts
end
end
由于我是Ruby新手(只读one book),我对这段代码有一些疑问:
self.
和self.up
中self.down
的含义是什么?它与简单up
和down
的区别?
所有这些冒号(:
)在:posts
,:name
等中的含义是什么?这只是变量名称的一部分吗?
t.string :name
的含义是什么?这是使用参数string
调用对象t
上的:name
函数吗?
非常感谢!!
答案 0 :(得分:3)
如果使用def foo
定义方法,则需要创建名为foo
的实例方法。即如果您有一个类CreatePosts
的实例,则可以执行the_instance.foo
。但是,通过执行def self.foo
(或def CreatePosts.foo
执行相同的操作,因为self == CreatePosts
- 块中的class ... end
,您正在定义一个仅可用的单例方法在CreatePosts
本身。即它被称为CreatePosts.foo
而不是the_instance.foo
(这有点类似于其他语言中的静态方法,但不完全是因为您可以使用相同的语法在非类的对象上定义单例方法)。
:name
与名为name
的任何变量无关。它是一个符号文字,有点像一个实体的不可变字符串(虽然Symbol类没有定义任何字符串操作的方法)。您可以将符号视为某种迷你字符串,当您只需要标记某些内容并且不需要进行字符串操作时,可以使用这些字符串。
是的,确实。
答案 1 :(得分:1)
self
是迁移文件,up
和down
分别适用和撤消迁移。t.sting :name
表示在当前迁移对象上创建一个名为name
并键入string
答案 2 :(得分:1)
def self.up定义了类方法。当rails运行该迁移时,它将调用CreatePosts.up。替代方法是def up,它将定义一个可以使用CreatePosts.new.up调用的实例方法。
:name(例如)是Symbol的示例。因为符号类似于字符串,但是被剥离到除了文本之外几乎没有任何东西的地方。在这种情况下,他们只是用它来告诉#string方法你想要调用的列。
你说的完全正确。
您可能会觉得这很有帮助。