Rails - 重命名列然后迁移

时间:2016-02-08 21:35:49

标签: ruby-on-rails ruby rspec

前言:我是Ruby / Rails的新手

所以我在'邀请'表中有一个名为“name”的列,我想将其重命名为“team_name”。我在我的迁移文件中更改了它,然后进行了回滚,然后重新运行迁移。

class CreateInvitations < ActiveRecord::Migration
  def change
    create_table :invitations do |t|
      t.string :token
      t.string :team_name
      t.integer :number_of_uses
      t.timestamps null: false
    end
  end
end

这就是我的架构现在的样子:

create_table "invitations", force: :cascade do |t|
    t.string   "token"
    t.string   "team_name"
    t.integer  "number_of_uses"
    t.datetime "created_at",     null: false
    t.datetime "updated_at",     null: false
  end

然后我去了'name'的所有实例改为'team_name',但现在我遇到了各种各样的错误。例如,

class Invitation < ActiveRecord::Base
  has_and_belongs_to_many :users

  validates :team_name, presence: true

使用规范,

describe '#team_name' do
    it { should validate_presence_of :team_name }
  end

并且rspec失败,

5) Invitation#team_name should require team_name to be set
     Failure/Error: it { should validate_presence_of :team_name }
     NoMethodError:
       undefined method `team_name=' for #<Invitation:0x007fd39a26def8>
     # ./spec/models/invitation_spec.rb:7:in `block (3 levels) in <top (required)>'

我得到的几乎所有错误都与此完全相同。我确保在我的工厂中也包括这个变化......我不确定这里到底发生了什么。当我更改列名并进行另一次迁移时,我是否犯了错误?再说一次,我还在学习Rails。感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

测试环境使用自己的数据库架构。确保您也更新了测试数据库:

bundle exec rake db:test:prepare

答案 1 :(得分:0)

您可以更改迁移文件名,但必须执行以下几个步骤:

  1. rake db:回滚到查询表被回滚的程度。
  2. 现在更改迁移文件的名称,以及内容。
  3. 更改可能使用该表的任何模型的名称。
  4. rake db:migrate