ActiveRecord:仅触发已保存对象的操作

时间:2012-11-09 18:16:34

标签: ruby-on-rails activerecord

我的Movie模型包含许多Photo。对于给定的电影,只能同时将一张照片设置为default?

我想知道如何在Rails上实现它。我添加了以下代码,

before_save :check_if_default

def check_if_default
  self.movie.photos.where(default: true).update_all(default: false) if self.default?
end

但是通过查看控制台,它不会将新对象更新为true状态。当试图这样做时,他们仍然是假的。

> a.photos.find(600).default = true
> a.photos.find(600).save
=> true 
a.photos.find(600).default
=> false

我想知道如果这可能是因为我正在迭代包括当前未保存的礼物的所有对象并将其设置为false?

如果是这种情况,我怎么才能只迭代那些已经保存在数据库中的项目?我想不建议在这里使用after_save回调,因为我应该确保将其他可能的default?设置为false,然后再为新照片设置为true。

1 个答案:

答案 0 :(得分:1)

您不会坚持更新您更新的实体。

尝试:

b = a.photos.find(600)
b.default = true
b.save

a.photos.find(600).update_attributes! {default:true}