模型范围正在破坏rake db:migrate - rails 3.2.3 postgres 9.1.3

时间:2012-05-23 23:31:51

标签: ruby-on-rails ruby postgresql ruby-on-rails-3.2

我遇到了在新的rails应用程序(3.2.3)中运行迁移的问题。我们使用的是postrgres 9.1.3和 - pg(0.13.2) -

当我运行rake db:create,然后rake db:migrate,我得到 - >

1.9.3-p194 (master) rake db:migrate --trace
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
rake aborted!
PG::Error: ERROR:  relation "roles" does not exist
LINE 4:              WHERE a.attrelid = '"roles"'::regclass
                                    ^
:             SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
          FROM pg_attribute a LEFT JOIN pg_attrdef d
            ON a.attrelid = d.adrelid AND a.attnum = d.adnum
         WHERE a.attrelid = '"roles"'::regclass
           AND a.attnum > 0 AND NOT a.attisdropped
         ORDER BY a.attnum

即使没有定义任何迁移,我也能得到这个,所以我不认为这是迁移本身的问题。当我查看堆栈跟踪时,我看到我的用户模型中定义的范围正在运行 - 当我将它们注释掉时,迁移运行没有问题。

scope :team_leaders, where(role_id: Role.where(name: 'Team Leader').first.try(:id))
scope :area_leaders, where(role_id: Role.where(name: 'Area Leader').first.try(:id))
scope :nation_leaders, where(role_id: Role.where(name: 'Nation Leader').first.try(:id))
scope :employees, where(role_id: Role.where(name: 'Employee').first.try(:id))

这是rails中的错误,还是我做错了什么?我真的很感激一些帮助 - 我们可以在应用程序中删除这些范围的使用,但这是我们想要避免的。

我是否应该将这些范围置于某种条件中,当条件在控制台中加载或作为服务器加载时调用,而不是在迁移期间调用?

非常感谢,

Dan Sowter

3 个答案:

答案 0 :(得分:16)

我遇到了完全相同的问题。经过2个小时的调试并拔掉我的头发,这位名叫 Carl Zulauf 的幸运的人在评论中发布了答案。

问题是我们在运行迁移时正在评估范围,因此与尚未迁移的另一个表的任何依赖关系都将导致该错误。

用lambda包装所有范围。例如:

scope :team_leaders, lambda { where(role_id: Role.where(name: 'Team Leader').first.try(:id)) }

为所有范围执行此操作。

这应该可以解决问题。他们需要进行惰性评估(仅在被调用时),如果没有lambda,他们会立即进行评估。

答案 1 :(得分:3)

如果您的范围以find_ find_by_foo开头,那么它们将会中断rake db:migrate。 这就是我案例中的错误。

答案 2 :(得分:0)

我实际上遇到了由默认范围引起的迁移问题,如下所示:

default_scope where(deleted: false)

错误是由这样的代码块引起的:

ModelName.all.each_with_index do |m, i|
...
end

此问题通过取消解决方案解决:

ModelName.unscoped.each_with_index do |m, i|
...
end