migrate 中 create_table 的初步探索

搞了几天rails了,太magic了。所以搞不清楚,只知道调用。
今天深入去了解了下 create_table 大家给指点指点

先请看流程:


再看 SchemaStatement 类的create_table()代码
ruby 代码
 
  1. # ====== Do not add a primary key column  
  2. #  create_table(:categories_suppliers, :id => false) do |t|  
  3. #    t.column :category_id, :integer  
  4. #    t.column :supplier_id, :integer  
  5. #  end  
  6. # generates:  
  7. #  CREATE TABLE categories_suppliers (  
  8. #    category_id int,  
  9. #    supplier_id int  
  10. #  )  
  11. #  
  12. # See also TableDefinition#column for details on how to create columns.  
  13. def create_table(table_name, options = {})  
  14.   table_definition = TableDefinition.new(self)  
  15.   table_definition.primary_key(options[:primary_key] || "id"unless options[:id] == false  
  16.   
  17.   yield table_definition  
  18.   
  19.   if options[:force]  
  20.     drop_table(table_name, options) rescue nil  
  21.   end  
  22.   
  23.   create_sql = "CREATE#{' TEMPORARY' if options[:temporary]} TABLE "  
  24.   create_sql << "#{quote_table_name(table_name)} ("  
  25.   create_sql << table_definition.to_sql  
  26.   create_sql << ") #{options[:options]}"  
  27.   execute create_sql  
  28. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值