首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用default_scope时出现Rails update_counters错误

使用default_scope时出现Rails update_counters错误
EN

Stack Overflow用户
提问于 2013-07-06 02:12:27
回答 2查看 463关注 0票数 0

我正在添加一个counter_cache,而我的迁移出现错误。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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。我检查了Rails4的源代码(我使用的是Rails3),update_counters还没有修复。我将重新打开ActiveRecord::CounterCache.update_counters并尝试取消它的作用域。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-06 03:47:43

如前所述,您的默认作用域正在将您绊倒。有一种更好的方法来避免迁移中的此类问题:在迁移的范围内重新定义模型:

代码语言:javascript
复制
class MigrateFooToBar < ActiveRecord::Migration

  class Foo < ActiveRecord::Base; end

  def up
    # ...
  end
end

然后当你从up中引用Foo时,你引用了限制无效和默认作用域MigrateFooToBar::Foo,它让你从A)必须太多地了解你的模型和B)当你的团队中的其他人运行你的迁移时迷惑了他们。

票数 1
EN

Stack Overflow用户

发布于 2013-07-06 03:43:46

Thx Baldrick我是rails新手和未作用域的工作:

代码语言:javascript
复制
Benefit.unscoped.update_counters b.id, :benefit_rows_count => b.benefit_rows.length
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17494708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档