ruby on rails在保存之前先更新另一个表

时间:2012-08-22 17:37:01

标签: ruby-on-rails model associations before-save

我正在尝试在保存之前更新另一个关联的表,但我遇到错误我不熟悉...

所以我的模特

post.rb

  before_save :update_total_items

  def update_total_items
    b = Tags.find(:tag_id => self.tag_id)
    b.total_items = b.total_items+1
    b.save
  end

但我收到错误

Unknown key tag_id

那么我如何在保存之前访问我要添加的属性以便使用它并更新另一个表上的现有关联?

2 个答案:

答案 0 :(得分:2)

通常只调用模型的id。一般来说你想要的是:

b = Tags.find(self.tag_id)

请注意,如果找不到记录,这可能会抛出ActiveRecord :: RecordNotFound异常。更安全的方法是:

if (b = Tags.where(:id => self.tag_id).first)
  b.increment!(:total_items)
end

避免加载和保存以增加值。你最终可能会陷入一种丑陋的竞争状态,你会失去数量。

作为一个注释,您的模型被称为Tags是非常不规则的。它应该被称为Tag

答案 1 :(得分:1)

Post对象没有外键tag_id,将其更改为

  b = self.tags.find(:post_id => self.id)

这是假设Post has_many:标签,以及Tag belongs_to:post

我同意@tadman你应该使用增量方法,  increment(attribute,by = 1)