在运行迁移时加入表错误

时间:2017-10-13 11:20:40

标签: ruby-on-rails ruby activerecord has-and-belongs-to-many

我在rails 5.1中有两个型号

class Category < ActiveRecord::Base
  has_and_belongs_to_many :sub_categories, join_table: "categories_join_table"
end

class SubCategory < ActiveRecord::Base
  has_and_belongs_to_many :categories, join_table: "categories_join_table"
end

我添加了多次迁移问题,当我尝试运行迁移时出现错误ERROR: relation "comfort_factor_sub_categories" does not exist,因为在迁移到创建表时,comfort_factor_sub_categories将在以后的迁移中运行。我怎么处理这个? 注意:我无法更改join_table的名称,因为它只是我长名的一个例子。

2 个答案:

答案 0 :(得分:2)

在撰写本文时,这个问题已经三年多了,但我刚刚遇到了同样的问题,所以我想在这里分享我的解决方案。

就我而言,我运行的是 Rails 6.1,所以我的错误消息看起来有点不同:

StandardError: An error has occurred, this and all later migrations canceled:

Could not find table 'officers_users'

officers_users 表是在以后的迁移中创建的连接表,但有问题的迁移没有使用它,那么为什么我会收到此错误?

起初,我认为这可能是 Rails 错误,因为我的迁移使用 update_columns 修改用户表,该表不应运行任何回调,但后来我注意到我正在更新它们的值with 依赖于计算属性,而后者又依赖于 officers_users 连接表。所以 Rails 是对的,我错了(再一次,哈哈)!解决方案只是使失败的迁移自给自足,而不需要该计算属性。一旦我这样做了,一切又好了。

因此,如果您遇到同样的问题,我建议您使用细齿梳检查您的迁移,并查找可能使用后续迁移的连接表的任何隐藏依赖项。

答案 1 :(得分:0)

如果我正确理解了您的问题,您添加了多次迁移,但由于找不到某些关系而无法运行它们。

在这种情况下,您应该duplicate the classes in migrations

class CreateCategories < ActiveRecord::Migration[5.1]
  class Category < ActiveRecord::Base
    # without declaring the relationship with the table which does not exist yet
  end

  def up
    create_table :categories do |t|
      # t.something
    end
  end
  def down
    drop_table :categories
  end
end

然后你应该为SubCategory做同样的事情。

要创建正确的join_table,您可以参考Rails official documentation