我正在添加一个counter_cache,我的迁移收到错误。
def up
add_column :benefits, :benefit_rows_count, :integer, :default => 0
Benefit.reset_column_information
Benefit.find(:all).each do |b|
Benefit.update_counters b.id, :benefit_rows_count => b.benefit_rows.length
end
end
SQL:
UPDATE "benefits" SET "benefit_rows_count" = COALESCE("benefit_rows_count", 0) + 0
WHERE "benefits"."id" IN (SELECT "benefits"."id"
FROM "benefits"
WHERE "benefits"."id" = 1
ORDER BY benefit_types.position, benefit_types.name, id)
此更新中的ORDER BY是因为default_scope而导致迁移失败。
不幸的是,当我更新记录时,我在执行回调update_counters时遇到同样的错误。我读过一些帖子,说应该避免使用default_scope。我检查了Rails 4源代码(我正在使用Rails 3)并且update_counters尚未修复。我要重新打开ActiveRecord :: CounterCache.update_counters并尝试取消它。
答案 0 :(得分:1)
如前所述,您的默认范围正在绊倒您。在迁移中有一种更好的方法可以避免此类问题:在迁移范围内重新定义模型:
class MigrateFooToBar < ActiveRecord::Migration
class Foo < ActiveRecord::Base; end
def up
# ...
end
end
当您从Foo
中引用up
时,您引用了限制范围和默认范围MigrateFooToBar::Foo
,它可以让您从A迁移,不得不知道太多关于你的模型和B)在你的团队运行你的迁移时混淆团队中的其他人。
答案 1 :(得分:0)
Thx Baldrick,我是铁杆新手。并且没有人工作:
Benefit.unscoped.update_counters b.id, :benefit_rows_count => b.benefit_rows.length