`
lemonzc
  • 浏览: 12174 次
  • 性别: 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  
流程。。。。

相关推荐

    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 。添加列...

    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 。 添加...

    laravel常用artisan命令

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

    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 意思:...

    contact-book

    然后将此代码放在db/migrate文件夹中创建的文件中: class CreateContacts &lt; ActiveRecord :: Migration [ 5.2 ] def change create_table ( :contacts ) do | table | table . string ( :first_name ) ...

    Laravel实现ApiToken认证请求

    1.打开 database/migrations/2014_10_12_000000_create_users_table.php 这个 migration 文件, 我们需要更改 user 表的结构 2.我们需要为 user 表添加 api_token 字段, 也就是说我们的 token 是保存在数据库中的, 在...

    volunteer-backend

    在本地主机上运行1, Install fe, run- yarn install- yarn watch2. copy .env.example .env3....Create5.1 Tạo migration- php artisan make:migration create_products_table --create=products5.2 Tạo mo

    laravel-admin自动生成模块,及相关基础配置方法

    一、模型创建、数据迁移、以及关联模型控制器 $ php artisan make:model Brand -m  //创建模型...$ php artisan migrate //运行迁移 ...路径:database/migrations/2018_10_16_0000_create_模型名s_table.php 在up方法

    rating:laravel 5评级系统

    Laravel评分 Laravel 5评分系统安装首先,通过Composer拉入包装... php artisan rating:migration它将生成&lt;timestamp&gt;_create_ratings_table.php迁移。 您现在可以使用artisan migrate命令运行它: php artisan migrate

    地区:laravel省市区联动数据生成

    在2018_01_01_000000_create_regions_table.php可以根据自身需求与结构修改表名或分段名 执行迁移 php artisan migrate 默认方法 use Cblink \ Region \ Region ; $ region = new Region (); $ region -&gt; ...

    node-pg-migrate:用于Postgresql的Node.js数据库迁移管理

    节点pg迁移 专为postgres构建的Node.js数据库迁移管理。 (但也可用于其他符合SQL标准的DB,例如 。)由,现在由维护。寻找v3文件? 参见。安装$ npm install node-pg-migrate pg安装此模块会将... createTable ( 'user

    Laravel-5-Generators-Extended:此软件包扩展了Laravel 5随附的核心文件生成器

    这允许您执行php artisan make:migration:schema create_dogs_table --schema="name:string:nullable, description:text, age:integer, email:string:unique"并获得可以使用php artisan migrate运行的完整迁移...

    laravel_101-bootcamp:laravel frameworkน。ศอรมการพัฒนาเว็บแอพลิเคชั้นด้วย

    dist laravel/laravel:^7.0 blog //博客เป็นชื่อโปรเจค php artisan make:migration create_posts_table //สร้างตารางฐานข้อมูล php artisan migrateคำสั่งในการจำล...

    authLaravelSimple:使用 auth laravel 控制用户权限

    作曲家创建项目 laravel/laravel authLaravelSimple --prefer-dist php artisan migrate:make create_users_table php工匠迁移php工匠数据库:种子/忘记密码/ php artisan auth:reminders-table php artisan 迁移/...

Global site tag (gtag.js) - Google Analytics