【问题标题】:Rails migration schema issueRails 迁移架构问题
【发布时间】:2015-08-03 08:43:37
【问题描述】:

在我的 Rails 应用程序中,我在数据库中有三个模型/表(用户、注册人、事件)。当我遇到一个问题说它找不到事件表时,我正在设置一些 Capybara/RSpec 测试。

现在事件模型运行良好,我已经能够创建事件、进入 Rails 控制台并查询诸如 Events.all 或 Events.find(1) 之类的内容。让我困惑的是我的模式。我的架构有

create_table "registrations", force: true do |t|
    t.string   "first_name"
    ...
end

create_table "users", force: true do |t|
    t.string   "email",                  default: "",    null: false
    ...
end

但是没有对事件表的引用。自从我为事件生成模型已经有一段时间了,但这里是迁移:

class CreateEvents < ActiveRecord::Migration
  def change
    create_table(:events) do |t|
      t.string :name
      t.string :location

      t.timestamps
    end
  end
end

我已经运行了诸如 rake db:reset 和 rake db:migrate 之类的命令,以确保我的所有迁移都是最新的。任何想法为什么事件表不在架构中?

更新: 因此,我删除了数据库和架构,并开始一次迁移每个迁移。当我运行迁移以创建它时,事件表就在那里,但是在我运行以下命令后,该表从架构中消失了:

class AddingAssociationsToEventsUserModels < ActiveRecord::Migration
  def change
    add_column :events, :belongs_to, :user, index: true
  end
end

这是正在运行的迁移:

rake db:migrate:redo VERSION=20150518132834
== 20150518132834 AddingAssociationsToEventsUserModels: migrating =============
-- add_column(:events, :belongs_to, :user, {:index=>true})
   -> 0.0006s
== 20150518132834 AddingAssociationsToEventsUserModels: migrated (0.0006s) ====

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rails-migrations


    【解决方案1】:

    这是因为test 数据库和development 数据库不匹配。

    运行:

    RAILS_ENV=test rake db:drop && rake db:create && rake db:migrate
    

    RAILS_ENV=test rake db:test:prepare
    

    RAILS_ENV=test rake db:reset
    

    以上任何一项都应该有效。

    【讨论】:

    • 快速问题,这是否只是解释了测试失败的原因?因为我仍然很困惑为什么表格不会显示在 db/schema.rb 文件中
    • 测试和开发共享相同的架构,但不同的数据库。您需要将两个数据库与相同的模式进行匹配。当您运行控制台或服务器时,rails 默认使用开发,而当您运行迁移时,rails 使用开发。您的测试助手可能没有正确配置,这就是为什么每次运行时都没有重新创建数据库的原因。
    • 所以我尝试了你的建议,但没有奏效。我删除了我的数据库和架构,并开始一次迁移每个迁移。所以事件表在某个迁移之前一直存在,然后在迁移之后它将失败。我会将迁移添加到我的问题中,也许您可​​以帮助我!
    【解决方案2】:

    好的,所以问题是我的迁移文件中的一个错误。以下是我将迁移更改为:

    class AddingAssociationsToEventsUserModels < ActiveRecord::Migration
      def change
        add_reference :events, :user, index: true
      end
    end
    

    现在 events 表在我的 Schema 中,测试可以找到该表并且正在通过!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2014-09-22
      • 2015-08-30
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多