我试图在rails应用中的ruby中迁移我的数据库,我对下面显示的正确语法感到有点困惑:
class CreateCategories < ActiveRecord::Migration
def change
create_table :categories do |t|
t.string :name
t.string :thumburl
t.timestamps
end
end
end
(1)为什么在类命名区域使用符号:Migration
?我读它的方式是创建一个类CreateCategories
,它继承了ActiveRecord
类的所有属性。我被告知双冒号表示类方法调用,但语法着色使我认为:Migration
组件实际上是一个符号。这里发生了什么?
(2)我认为create_table
是一种方法,但为什么要使用:categories
,即符号,而不是类或实例变量,即@@categories
或{{1} }?我想你必须说出正在创建的表格,但为什么是符号呢?
(3)为什么@categories
和:name
符号而不是变量?
答案 0 :(得分:2)
ActiveRecord::Migration
不是符号,它是继承自的超类的名称。 ::
是范围解析运算符,因此Migration
是ActiveRecord
模块的成员。
至于为什么在各个地方使用符号,它们被用来代替你可能使用String的地方,例如给表格命名。您可以使用“类别”,但由于符号本质上只是指向对象的指针,因此在内存存储方面存在一定的额外效率,因为您没有在使用该符号的任何位置创建新字符串。
为了说明这个想法,请以下面的脚本为例:
puts 'categories'.object_id
puts 'categories'.object_id
puts '---------------------'
puts :categories.object_id
puts :categories.object_id
运行脚本可能会产生类似于此的内容:
19608760
19608660
---------------------
839388
839388
字符串版本有两个不同的ID,这意味着创建了两个单独的String对象。但是,符号版本打印相同的ID,这意味着只创建一个对象来表示符号,并且在使用符号的任何地方都使用相同的对象。
答案 1 :(得分:0)
(1)您的标记化:Migration
是错误的。它应该被理解为::Migration
。 ::
是范围解析运算符。这意味着在Migration
的名称空间内理解ActiveRecord
。你是对的::
被用作类方法调用。实际上,::
有两个用途:范围解析运算符和类方法调用;它含糊不清。在这里,它是前者。
(2,3)@@categories
或@categories
或任何其他变量将被评估为它所拥有的特定值。这并不意味着&#34;类别&#34;。为了说出&#34;类别&#34;之类的内容,在字符串中将其表示为"category"
,或在符号中表示为:category
,这是一种方法。