07. rails 创建user模型

rails帮助命令

rails -h

创建user模型

命令行

haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/ruby/circles$ rails g model user
Running via Spring preloader in process 30704
      invoke  active_record
      create    db/migrate/20210110133050_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml

注意
这里注册模型的名字是单数的形式(user),
而数据库表的名字是会自动创建为复数所形式(users)

编写users表迁移文件

编写表迁移文件 20210110133050_create_users.rb

class CreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :username
      t.string :password
      t.timestamps null:false
    end
  end
end

迁移 users

执行 rails db:migrate 或者 rake db:migrate都可以,

注意

执行后会,会创建没有被迁移的表
已经创建过的表不会再次被创建

haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/ruby/circles$ rails db:migrate
== 20210110133050 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0757s
== 20210110133050 CreateUsers: migrated (0.0758s) =============================

从下图片看到已经创建成功了

会在数据表(schema_migrations)中创建一条和迁移文件名一样的记录,说明已经迁移过

回滚数据库:
rails db:migrate #回滚最后一次迁移的数据表
rake db:rollback STEP=n #回滚最后n次迁移的数据表
rake db:migrate:down VERSION=20210622161900 #回滚指定版本号迁移的数据表(指定迁移的文件名)

控制台操作user表

增/删/改/查

haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/ruby/circles$ rails console #进入控制台
Running via Spring preloader in process 3956
Loading development environment (Rails 6.1.1)
3.0.0 :001 > User #选择user表
 => User (call 'User.connection' to establish a connection) 
3.0.0 :002 > User.create username:'zhangshan',password:'123456' #创建一条记录
  TRANSACTION (0.5ms)  BEGIN
  User Create (0.4ms)  INSERT INTO `users` (`username`, `password`, `created_at`, `updated_at`) VALUES ('zhangshan', '123456', '2021-01-10 14:06:14.558342', '2021-01-10 14:06:14.558342')
  TRANSACTION (16.7ms)  COMMIT
 => #<User id: 1, username: "zhangshan", password: [FILTERED], created_at: "2021-01-10 14:06:14.558342000 +0000", updated_at: "2021-01-10 14:06:14.558342000 +0000"> 
3.0.0 :003 > User.all.to_a #查询所以记录
  User Load (0.8ms)  SELECT `users`.* FROM `users`
 => [#<User id: 1, username: "zhangshan", password: [FILTERED], created_at: "2021-01-10 14:06:14.558342000 +0000", updated_at: "2021-01-10 14:06:14.558342000 +0000">] 
3.0.0 :006 > user = User.first #查询第一条记录并赋值给user变量
  User Load (0.5ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
 => #<User id: 1, username: "zhangshan", password: [FILTERED], created_at: "2021-01-10 14:06:14.558342000 +0000", updated_at: "2021-01-10 14:06:14.558342000 +0000"> 
3.0.0 :007 > user
 => #<User id: 1, username: "zhangshan", password: [FILTERED], created_at: "2021-01-10 14:06:14.558342000 +0000", updated_at: "2021-01-10 14:06:14.558342000 +0000"> 
3.0.0 :008 > user.id #打印id
 => 1 
3.0.0 :009 > user.username #打印username
 => "zhangshan" 
3.0.0 :010 > user.username = 'lisi' #给username重新赋值
 => "lisi" 
3.0.0 :011 > user.save #修改user.id = 1的这条数据的`username` = 'lisi'
  TRANSACTION (0.3ms)  BEGIN
  User Update (2.9ms)  UPDATE `users` SET `users`.`username` = 'lisi', `users`.`updated_at` = '2021-01-10 14:10:54.782612' WHERE `users`.`id` = 1
  TRANSACTION (860.2ms)  COMMIT
 => true 
3.0.0 :013 > user.destroy #删除user.id = 1 的记录
  TRANSACTION (0.3ms)  BEGIN
  User Destroy (0.4ms)  DELETE FROM `users` WHERE `users`.`id` = 1
  TRANSACTION (17.7ms)  COMMIT
 => #<User id: 1, username: "lisi", password: [FILTERED], created_at: "2021-01-10 14:06:14.558342000 +0000", updated_at: "2021-01-10 14:10:54.782612000 +0000"> 

3.0.0 :017 > User.create username:'zhangshan',password:'123456' #创建
  TRANSACTION (0.2ms)  BEGIN
  User Create (0.4ms)  INSERT INTO `users` (`username`, `password`, `created_at`, `updated_at`) VALUES ('zhangshan', '123456', '2021-01-10 14:20:48.808927', '2021-01-10 14:20:48.808927')
  TRANSACTION (285.9ms)  COMMIT
 => #<User id: 2, username: "zhangshan", password: [FILTERED], created_at: "2021-01-10 14:20:48.808927000 +0000", updated_at: "2021-01-10 14:20:48.808927000 +0000"> 
3.0.0 :018 > User.find(2) #查找id=2的数据
  User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1


IDE操作

rails g model user name:string phone:string email:string gender:integer"

/bin/bash --login -c "export PATH=/home/haima/.rvm/rubies/default/bin:/home/haima/.rvm/rubies/ruby-2.3.8/bin:/home/haima/.rvm/rubies/ruby-2.3.8/lib/ruby/gems/2.3.0/bin:/home/haima/.gem/ruby/2.3.0/bin:$PATH && rails g model user name:string phone:string email:string gender:int"
      invoke  active_record
      create    db/migrate/20210622160851_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml

Process finished with exit code 0.

后台操作和上面的命令号里一样,迁移数据表

常用类型

class CreateTests < ActiveRecord::Migration[5.0]
  def change
    create_table :tests do |t|
      t.string :name
      t.string :phone ,null: false
      t.string :email ,null: false,default:""
      t.integer :gender ,default: 0
      t.boolean :isadmin
      t.string  :category,limit: 2, index: true #1 :系统消息, 2: 社区消息 limit: 2创建后是varchar(2)
      t.datetime :vip_duration # vip过期时间
      t.decimal :value, precision: 8, scale: 2
      t.boolean :is_agg, default: false
      t.string :state, default: "init"
      t.date :date
      t.datetime :birthday

      t.timestamps null: false
    end
    add_index :tests, :phone #设置主键索引
    add_index :tests, :email
  end
end


生成表

CREATE TABLE `tests` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `phone` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL DEFAULT '',
  `gender` int(11) DEFAULT '0',
  `isadmin` tinyint(1) DEFAULT NULL,
  `category` varchar(2) DEFAULT NULL,
  `vip_duration` datetime DEFAULT NULL,
  `value` decimal(8,2) DEFAULT NULL,
  `is_agg` tinyint(1) DEFAULT '0',
  `state` varchar(255) DEFAULT 'init',
  `date` date DEFAULT NULL,
  `birthday` datetime DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `index_tests_on_category` (`category`),
  KEY `index_tests_on_phone` (`phone`),
  KEY `index_tests_on_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

创建companies模型

1.命令行执行
rails g model company
2.编写迁移文件

class CreateCompanies < ActiveRecord::Migration[5.0]
  def change
    create_table :companies, comment: '公司信息表' do |t|
      t.integer :company_sn, default: 0, comment: '公司编号'
      t.string :company_name, default: '', comment: '公司名称'
      t.timestamps
    end
    add_index :companies, [:company_sn], unique: true
  end
end

创建company_ips模型

1.命令行执行
rails g model company_ips
2.编写迁移文件

class CreateCompanyIps < ActiveRecord::Migration[5.0]
  def change
    create_table :company_ips, comment: '公司ip表' do |t|
      t.belongs_to :company, comment: '公司表主键id' #关联companies表 会自动生成company_id字段和索引
      t.string :ip,:null => false, comment: '公司ip'
      t.timestamps
    end
    add_index :company_ips, [ :company_id,:ip], unique: true, name: "index_company_ips_on_company_ids_on_ip"
  end
end

执行迁移

haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/ruby/fofapro$ rake db:migrate
== 20210720091416 CreateCompanyIps: migrating =================================
-- create_table(:company_ips, {:comment=>"公司ip表"})
   -> 0.0895s
-- add_index(:company_ips, [:company_id, :ip], {:unique=>true, :name=>"index_company_ips_on_company_ids_on_ip"})
   -> 0.0713s
== 20210720091416 CreateCompanyIps: migrated (0.1612s) ========================

生成的表

CREATE TABLE `companies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `company_sn` int(11) DEFAULT '0' COMMENT '公司编号',
  `company_name` varchar(255) DEFAULT '' COMMENT '公司名称',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_companies_on_company_sn` (`company_sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='公司信息表';

CREATE TABLE `company_ips` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `company_id` int(11) DEFAULT NULL COMMENT '公司表主键id',
  `ip` varchar(255) NOT NULL COMMENT '公司ip',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_company_ips_on_company_ids_on_ip` (`company_id`,`ip`),
  KEY `index_company_ips_on_company_id` (`company_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='公司ip表';

编写关系模型

app/models/company.rb

class Company < ApplicationRecord

  validates :company_sn, presence: { message: "公司编号不能为空" }

  has_many :company_ips,dependent: :destroy

end

app/models/company_ip.rb

class CompanyIp < ApplicationRecord

  validates :company_id, presence: { message: "公司id不能为空" }
  validates :ip, presence: { message: "公司ip不能为空" }

  belongs_to :company
end

posted @ 2021-01-10 21:41  HaimaBlog  阅读(156)  评论(0编辑  收藏  举报