在 运行 迁移中加入 table 错误

Join table error on running migration

我有两个模型 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 因为在迁移中创建 table comfort_factor_sub_categories 将 运行 在以后的迁移中。我该如何处理? 注意:我无法更改 join_table 的名称,因为它只是一个示例,我的名称很长。

如果我对你的问题的理解正确,你已经添加了几个迁移,但你不能运行它们,因为没有找到某些关系。

在那种情况下,你应该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

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

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

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

Could not find table 'officers_users'

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

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

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