【问题标题】:Updating a belongs_to model after_saveafter_save 更新一个 belongs_to 模型
【发布时间】:2013-04-11 15:42:43
【问题描述】:

我有一个 has_many :comments 的 User 模型和一个 belongs_to :user 的 Comment 模型。

我想收集comment.ratings 来设置user.rating,所以我在我调用的评论模型中有一个after_save 方法。然而,这永远不会被调用。

方法如下:

def update_user_rating
  user = User.find(self.is_about)
  user.trip_rating = (Comment.find_all_by_is_about(self.is_about).collect { |comment| comment.rating }.sum) / 
    Comment.find_all_by_is_about(self.is_about).count
end

我检查了 ruby​​ 代码,它可以在控制台上运行,所以我认为它不是 ruby​​ 代码。

是的,我在模型中也有 after_save :update_user_rating。

我想了解我做错了什么?

编辑:基于调试器,我看到 user.trip_rating= 的第一部分永远不会执行。意思是我试图在那条线上做next,但它从未通过,所以我假设那条线是问题所在。但是再次检查rails控制台,我看到它在那里工作。我不明白!

已解决:尽管我不喜欢它,但这是我解决问题的方法。我删除了 after_save 回调并向用户模型添加了一个方法来计算自己的评分,并在控制器中调用它。

【问题讨论】:

  • 我猜你没有保存用户对象。最后输入user.save
  • 我添加了它,但仍然没有任何改变。虽然谢谢,但这是有道理的。
  • 你可以试试user.save!,如果保存有问题会报错
  • @Zippie 不会在 update_user_rating 方法内调用 user.save 导致无限递归,因为该保存将调用另一个 update_user_rating?
  • 这不是无限递归,因为它是来自comments 而不是users 的回调

标签: ruby-on-rails ruby callback after-save


【解决方案1】:

也许您的update_user_rating 正在被调用,但方法中的某些行失败了。

试试 user = User.find(self.user_id)user = User.find_by_is_about(self.is_about)

【讨论】:

  • 应该是user = User.find(self.user_id),虽然我不知道self.is_about是什么意思,也不包含
  • 啊,我错过了这是来自 cmets 而不是用户的回调部分
  • user_id 是评论的所有者,而 is_about 是关于它的用户
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2014-11-01
  • 1970-01-01
相关资源
最近更新 更多