【问题标题】:Ruby on Rails ActiveRecord size on association returns twice the amount of count after duplicating a modelRuby on Rails ActiveRecord 关联大小在复制模型后返回两倍的计数
【发布时间】:2017-11-10 18:26:07
【问题描述】:

复制活动记录对象后,我的新对象关联大小返回数据库中实际数量的两倍。我已经看到 size 尝试加载缓存版本并且 count 实际上执行查询,但我不想总是执行 SQL 查询只是为了显示数量。 我的(相关)代码如下所示:

class Model1 < ActiveRecord::Base
def copy_model
 new_model = self.dup
 new_model.name = "Copy of #{name}"
 new_model.association = association.map{|a| a.dup}
 new_model.save
 new_model
end

在 new_model.association 上调用 .size 后返回两倍的 .count

【问题讨论】:

  • 不,你一定是在别处做错了。 Count 和 Size,两者都会给出相同的输出。此外,在您上面的代码中,它们在复制关联时出现语法错误。否则,上面的代码可以完美地复制模型。
  • 试试new_model.association.reload.count
  • @MrYoshiji count 是一个查询,将返回准确的结果。如果“Array”已经是loaded?,则size 是针对关联“Array”的方法调用。如果 size 包含尚未预置的对象,则 size 可能与 count 不同。 count 带或不带 reload 将返回相同的结果。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我已经检查过了,您在 Rails 4 上的代码没有任何问题。尝试将 Rspec 编写为:

copied_model = ...
expect(copied_model.reload.association.size).to eq 3

此外,当关联模型是引用远程存储的Image 时,可能会出现问题。但是如果没有进一步的上下文,association 是什么,很难在这里找到问题。

假设您知道association 是一个保留字,并且您不能将其用作自定义集合名称。

【讨论】:

  • 关联只是另一个活跃的记录类。但我意识到它有这一行:belongs_to :model, counter_cache: :association_count,根据文档,它使方法大小更有效。但在我的情况下,它也可能会混淆缓存,对吗?
  • 好的编辑:我做了一些谷歌搜索,发现:apidock.com/rails/ActiveRecord/CounterCache/reset_counters 重置计数器解决了我的问题。耶!非常感谢让我看看其他地方。
【解决方案2】:

所以,在 Aakash Gupta 和 Szymon 说我在其他地方做错了什么之后,我发现我的关联类有这样一行:

belongs_to :model, counter_cache: :association_count

这样可以使 size 运算符更高效并跳过数据库查询。但是,在复制对象后,我的缓存已损坏。所以调用:

Model.reset_counters(new_model.id, :association)

如此处所述: https://apidock.com/rails/ActiveRecord/CounterCache/reset_counters 解决了我的问题。

【讨论】:

    【解决方案3】:

    不要做地图。请尝试以下操作:

    association.each do |a| 
      new_model.association << a.dup
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多