搞了几天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