2007-12-21
migrate 中 create_table 的初步探索
关键字: migrate create_table
搞了几天rails了,太magic了。所以搞不清楚,只知道调用。
今天深入去了解了下 create_table 大家给指点指点
先请看流程:
再看 SchemaStatement 类的create_table()代码
大家明白了吧。
根据传递的参数,一步一步来创建 create_sql, 然后execute来执行。
字段的组合是用 yield table_definition
具体可以去跟踪 TableDefinition 类(schema_definitions.rb 文件里面, path: gems\1.8\gems\activerecord-2.0.1\lib\active_record\connection_adapters\abstract )
通过这个跟踪,知道了很多东西,不错。
现在也了解选项:force是什么意思。
也了解了 some_method *args do |something|
end
这种书写方法的意思。 do .... end就是 some_method 里面的yield
今天深入去了解了下 create_table 大家给指点指点
先请看流程:
再看 SchemaStatement 类的create_table()代码
ruby 代码
- # ====== Do not add a primary key column
- # create_table(:categories_suppliers, :id => false) do |t|
- # t.column :category_id, :integer
- # t.column :supplier_id, :integer
- # end
- # generates:
- # CREATE TABLE categories_suppliers (
- # category_id int,
- # supplier_id int
- # )
- #
- # See also TableDefinition#column for details on how to create columns.
- def create_table(table_name, options = {})
- table_definition = TableDefinition.new(self)
- table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false
- yield table_definition
- if options[:force]
- drop_table(table_name, options) rescue nil
- end
- create_sql = "CREATE#{' TEMPORARY' if options[:temporary]} TABLE "
- create_sql << "#{quote_table_name(table_name)} ("
- create_sql << table_definition.to_sql
- create_sql << ") #{options[:options]}"
- execute create_sql
- end
大家明白了吧。
根据传递的参数,一步一步来创建 create_sql, 然后execute来执行。
字段的组合是用 yield table_definition
具体可以去跟踪 TableDefinition 类(schema_definitions.rb 文件里面, path: gems\1.8\gems\activerecord-2.0.1\lib\active_record\connection_adapters\abstract )
通过这个跟踪,知道了很多东西,不错。
现在也了解选项:force是什么意思。
也了解了 some_method *args do |something|
end
这种书写方法的意思。 do .... end就是 some_method 里面的yield
评论
lemonzc
2007-12-21
为什么以前的create_table 里面的 do |t| ... end 块
可以写成:
的原因是应为下面的这个代码块:
代码是在:
schema_definitions.rb
%RUBY_HOME%\gems\1.8\gems\activerecord-2.0.1\lib\active_record\connection_adapters\abstract
create_table :users do |t|
t.column :user_name, :string
t.column :user_password, :string
end
可以写成:
create_table :users do |t|
t.string :user_name
t.string :user_password
end
的原因是应为下面的这个代码块:
def column(name, type, options = {})
column = self[name] || ColumnDefinition.new(@base, name, type)
column.limit = options[:limit] || native[type.to_sym][:limit] if options[:limit] or native[type.to_sym]
column.precision = options[:precision]
column.scale = options[:scale]
column.default = options[:default]
column.null = options[:null]
@columns << column unless @columns.include? column
self
end
%w( string text integer float decimal datetime timestamp time date binary boolean ).each do |column_type|
class_eval <<-EOV
def #{column_type}(*args)
options = args.extract_options!
column_names = args
column_names.each { |name| column(name, '#{column_type}', options) }
end
EOV
end
代码是在:
schema_definitions.rb
%RUBY_HOME%\gems\1.8\gems\activerecord-2.0.1\lib\active_record\connection_adapters\abstract
lemonzc
2007-12-21
流程。。。。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 881 次
- 性别:

- 来自: 成都

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Ruby 在 Notepad++ 上飞 ...
所以说Notepad++对于处理SJIS等非Unicode编码的文件还是无解咯? ...
-- by justps -
Ruby 在 Notepad++ 上飞 ...
notepad++ 功能还不错, 但性能差强人意, 打开超过 3000 的文本基 ...
-- by Feiing -
Ruby 在 Notepad++ 上飞 ...
kenlistian 写道我感觉editplus也是不错啊,装了个ultraed ...
-- by qubic -
Ruby 在 Notepad++ 上飞 ...
我感觉editplus也是不错啊,装了个ultraedit和editplus,觉 ...
-- by kenlistian -
Ruby 在 Notepad++ 上飞 ...
femto 写道能支持函数列表么?就是类似于其他IDE里头,在某个文件时, 左边 ...
-- by flynetcn






评论排行榜