Rails 3 - 在model.save之后修改其他模型的属性

Posted

技术标签:

【中文标题】Rails 3 - 在model.save之后修改其他模型的属性【英文标题】:Rails 3 - modifying an attribute of other model after model.save 【发布时间】:2012-06-04 16:41:47 【问题描述】:

不幸的是,我可能仍然是一个 Rails 初学者,所以,即使我考虑并尝试了不同的方法,我也没有得到我想要的工作,现在不得不再次寻求帮助。

我有一个 REST 评论投票机制,每条评论都会竖起大拇指。这很好用,每个都用 counter_cache 处理来计数。现在,基于这些赞成票和反对票,我想计算每个评论的正负值,thumbs_up-votes - thumbs_down-votes。虽然我不确定这是否是处理该问题的最有效方法,但我计划将正负值作为评论模型的额外整数属性(而竖起大拇指和向下竖起大拇指是自己的模型)。所以,我基本上想要的是,当保存thumbs_up 时,评论的加减属性自动应该是+= 1,并且分别为thumbs_down.save a -= 1

如何从 thumbs_up 控制器中发出这样的操作?我需要修改我的 form_for 还是我的方法完全错误?

是否有一个 after_save 回调来处理不同模型的属性?

【问题讨论】:

为什么需要 thumbs_up 控制器?根据您提供的内容,您似乎不需要存储 thumbs_up 或 thumbs_down。除非,也就是说,你想显示 thumbs_up 和 thumbs_down 的数量... 是的,我正在展示这些投票,此外还有 24 小时投票限制。因此,使用额外的拇指向上/向下模型更容易处理这个问题 【参考方案1】:

从你所给予的,很难说。但我想说,如果您需要独立显示评论的“赞”和“赞”,请将它们存储为您的 Comment 模型的字段。然后,只需在您的 Comment 模型中创建一个辅助方法即可获得评论的评分:

   def rating
      thumbs_up - thumbs_down
   end

编辑: 对于您的新评论,我仍然会说创建一个辅助方法而不是一个字段。

   #models/comment.rb
   def rating
      thumbs_up.all.length - thumbs_down.all.length #or whatever way you want to do this
   end

【讨论】:

我的意思是我的赞成票和反对票都很好,它们被保存为一个列表,只有 2 列,id 和 comment_id;然后通过 counter_cache 计数。现在,在此基础上,我想在保存“thumbs_up”或“thumbs_down”时计算这个“plusminus”值。 @rails_has_elegance 对。所以让它成为一个辅助方法,就像我在上面展示的那样。制作另一个字段是不必要的,因此会适得其反。 @rails_has_elegance 我刚才说的是rating,因为这比称它为plusminus 更直观一点;)。如果你的实现有点不同,那很好:我不可能在没有看到你的代码的情况下知道如何编写代码。 是否可以根据辅助方法订购 cmets?就像@comments.order("rating DESC") 我认为您只能根据模型的属性订购模型。我喜欢那个辅助方法,但是这种排序是否可行?并感谢您的帮助! @rails_has_elegance 我很确定。它只是一个普通的 Ruby sort【参考方案2】:

如果您不想将两个不同的模型与实际上不属于这两个模型的辅助方法混合,您可以使用 Observers http://api.rubyonrails.org/classes/ActiveRecord/Observer.html

您的观察者会观察一个模型并做某事

【讨论】:

以上是关于Rails 3 - 在model.save之后修改其他模型的属性的主要内容,如果未能解决你的问题,请参考以下文章

无法使用“model.save()”保存自定义模型

.save() 和使用 update() 之间的猫鼬区别

在 model.save 或 model.save 中捕获数据库异常!方法?

Keras model.save() 和 model.save_weights() 的区别?

我可以让 model.save() 有一个返回值吗?

骨干同步发送 CORS 预检,但之后啥也不做