我在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的名称,因为它只是我长名的一个例子。
答案 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