使用default_scope Rails update_counters错误

时间:2013-07-05 18:12:27

标签: ruby-on-rails migrate

我正在添加一个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并尝试取消它。

2 个答案:

答案 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