`
lemonzc
  • 浏览: 12361 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论
2 楼 lemonzc 2007-12-21  
为什么以前的create_table 里面的 do |t| ... end 块

    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
1 楼 lemonzc 2007-12-21  
流程。。。。

相关推荐

    YII 2数据库迁移(Migrations) 使用教程

    $this-&gt;createTable('{{%page_template}}', [ 'id' =&gt; $this-&gt;primaryKey(), 'name' =&gt; $this-&gt;string()-&gt;notNull(), 'content' =&gt; $this-&gt;text()-&gt;notNull(), 'created_at' =&gt; $this-&gt;integer()-&gt;notNull(), ...

    markov-lyrics:Markov歌词生成器

    捆绑执行rake db:create_migration NAME = create_words_table_again 建立表格 def change create_table:lines做| t | t.integer:line_number结束 或修改现有表 def change rename_column :songs, :numer_of_...

    has_array_of:PostgreSQL数组上的ActiveRecord关联

    HasArrayOf ... # db/migrate/20141027125227_create_playlist.rb class CreatePlaylist &lt; ActiveRecord :: Migration def change create_table :playlists do | t | t . integer :video_ids , a

    migrate:PostgreSQL迁移的命令行工具

    migrate -path ./db/migrations create add_field_to_table migrate -url postgres://user@host:port/database -path ./db/migrations -timeout 10 up migrate -url postgres://user@host:port/database -path ./db/...

    Writing-migrations-onl01-seng-ft-090820

    定义一个名为change的方法,并在该方法中使用Active Record create_table方法创建表。 该表应具有带string类型的:name列。 完成定义change方法后,通过在终端中运行rake db:migrate来运行rake db:migrate 。 添加...

    Writing-migrations-v-000

    定义一个名为change的方法,并在该方法中使用Active Record create_table方法创建表。 该表应具有带string类型的:name列。 完成定义change方法后,通过在终端中运行rake db:migrate来运行rake db:migrate 。添加列...

    laravel_migrate:laravel迁移

    在 Laravel 框架中,`laravel_migrate` 是一个关键的概念,它与数据库迁移密切相关。数据库迁移是 Laravel 提供的一种版本控制系统,允许开发者在不同的开发环境中对数据库结构进行同步,确保团队成员都能拥有相同的...

    active-record-writing-migrations-lab

    定义一个名为change的方法,并在该方法中使用Active Record create_table方法创建表。 该表应具有带string类型的:name列。 完成定义change方法后,通过在终端中运行rake db:migrate来运行rake db:migrate 。 添加...

    active-record-writing-migrations-lab-dc-web-012720

    定义一个名为change的方法,并在该方法中使用Active Record create_table方法创建表。 该表应具有带string类型的:name列。 完成定义change方法后,通过在终端中运行rake db:migrate来运行rake db:migrate 。 添加...

    Flyway数据库迁移工具详解.docx

    例如,版本迁移的文件名为`V1.2__create_test_table.sql`,其中`V`是版本迁移的前缀,`1.2`是版本号,`create_test_table`是描述,`.sql`是后缀。 在SpringBoot项目中集成Flyway非常简便。首先,添加Flyway的依赖到...

    Laravel学习笔记数据库数据库迁移案例[借鉴].pdf

    php artisan migrate:make create_authors_table ``` 这将在 app/database/migrations 目录下生成一个新的迁移文件,名为 2014_03_11_162133_create_authors_table.php。 在这个迁移文件中,我们需要定义两个方法:...

    laravel常用artisan命令

    建立数据表 php artisan make:migration create_tasks_table --create=tasks 把表写入数据库 php artisan migrate 在生产环境中强制运行迁移,没有提示 php artisan migrate --force

    Laravel开发-fast-migrate

    2. **命名规范**:为迁移文件提供清晰的命名,如 `create_users_table.php`,以便了解其功能。 3. **测试环境**:在开发过程中,先在测试环境中运行迁移,确保无误后再部署到生产环境。 4. **数据库设计**:遵循良好...

    Laravel学习笔记数据库数据库迁移案例.pdf

    `php artisan migrate:make create_authors_table` 这将在 app/database/migrations 目录下创建一个名为 2014_03_11_162133_create_authors_table.php 的文件。 迁移文件的解剖 迁移文件继承自 Illuminate\...

    Laravel开发-resulttable

    使用`php artisan migrate:make create_resulttable`命令,可以创建一个新迁移文件,用于创建名为`resulttable`的表。这个文件将包含两个方法:`up`和`down`。`up`方法用于执行数据库变更,而`down`方法则用于回滚...

    Laravel 5框架学习之数据库迁移(Migrations)

    database migrations 是laravel最强大的功能之一。数据库迁移可以理解为数据库的版本控制器。 在 database/migrations 目录中包含两个迁移文件...Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_1

    Laravel学习基础之migrate的使用教程

    本文就详细的介绍了关于Laravel中migrate使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 生成迁移 命令: Migration php artisan make:migration create_users_table 意思:...

    从头开始构建数据库的一个artisan命令

    在Laravel中,我们使用`php artisan make:migration create_table_name`命令创建一个新的迁移文件,然后在该文件中定义数据库表的结构。 例如,创建一个`users`表的迁移文件,可以运行以下命令: ``` ...

    Laravel开发-oauth2-server

    Schema::create('oauth_clients', function (Blueprint $table) { $table-&gt;bigIncrements('id'); $table-&gt;string('secret', 100)-&gt;nullable(); $table-&gt;unsignedInteger('user_id')-&gt;nullable(); $table-&gt;...

Global site tag (gtag.js) - Google Analytics