【问题标题】:Updating an associated record from a join table model从连接表模型更新关联记录
【发布时间】:2010-01-13 23:06:12
【问题描述】:

我有一个 has_many :through 关系,通过管理层将球员与球队联系起来。

我想在团队表上设置一个计数器(有点像计数器缓存),它告诉我自本周初以来有多少新关联。当然,计数器缓存不会起作用,因为它总是会给出曾经创建的所有关联。

我已尝试从管理模型中更新相关团队。这永远不会成功。即使关联团队的增量似乎已保存好,但在创建关联后,我的计数器仍为 0。

我也尝试过使用观察者。观察者如我预期的那样被调用,我能够检索团队,但对它的任何更新都没有保存。

我确定我遗漏了一些明显的东西! Rails 的实现方式是什么?

我设置了一个 github 来说明问题,运行 rake spec 会失败。

http://github.com/steveybaby/assoc_problem

【问题讨论】:

  • 您如何从管理模型中增加团队计数器?

标签: ruby-on-rails activerecord persistence save has-many-through


【解决方案1】:

在您的规范中:

fanteam_spec.rb

it "should be able to create a fanteam" do
    @fanteam.save
    @fanteam.changes.should be(0)
    @fanteam.should be_valid
    @fanteam.players << Factory.build(:player)

    @fanteam.reload # this is what you are forgetting

    @fanteam.changes.should be(1)
  end

基本上你的观察者更新的是同一个记录,但不是同一个对象。

【讨论】:

  • 哦,我忘了说你应该使用 ActiveRecord 的 increment_counter 方法,因为它是原子的和并发友好的,可以这么说。
  • 我也不止一次发生过 :)
【解决方案2】:

我怀疑问题在于您将计数器字段命名为changes,这已经是一种 ActiveRecord 方法,用于检查自上次保存以来对记录属性的更改。尝试更改该字段的名称,看看您的代码是否有效。

【讨论】:

  • 问题甚至比这更愚蠢:) 我尝试了其他字段名称但没有成功。看起来我的代码没问题 - 但我的测试很垃圾
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多