【问题标题】:Rails - How can I save a field value (that uses a record's ID) though a callback?Rails - 如何通过回调保存字段值(使用记录的 ID)?
【发布时间】:2012-01-01 21:52:42
【问题描述】:

我想创建一个哈希,它结合了创建用户的 user_id + 记录的 ID 来生成 MD5 哈希,但仅限于创建记录时。 (原因很冗长,但本文将其提取出来)。

我正在尝试:

class BlogPost < ActiveRecord::Base  

  after_create :hash_this

  private

  def hash_this
    self.info_md5_hashed = (id.to_str + creator_user_id).my_MD5_hash_method
  end

end

如何确保info_md5_hashed 字段实际保存到数据库中?

如果我使用before_create,我会假设 ID 还不可用? :(
如果我使用 after_create,我会假设 ID 现在可用
- 但我是否需要以某种方式再次保存以存储新计算的 info_md5_hashed 字段值?

【问题讨论】:

  • 您能否发布更多关于您要解决的更广泛问题的具体信息?如果我对您为什么需要这个有更多了解,我可以更新我的答案。在创建时生成附加到用户的不可变 ID(不是主键)是另一种选择......例如一个 UUID。

标签: ruby-on-rails ruby authentication hash md5


【解决方案1】:

是的,您必须保存记录两次,因为 ID 生成发生在数据库中。解决这个问题的唯一方法是对 ID 进行预排序,但几乎可以肯定没有意义,您应该接受必须保存记录两次;)

只需从您的after_create 挂钩中调用第二次保存即可 - 可以这样做(即不会成为循环重复问题),因为第二次保存不会再次触发该挂钩;)

n.b.如果您想避免双重保存,您始终可以将哈希值基于您知道唯一的内容,例如用户名或电子邮件。

【讨论】:

  • 好的,我是否将它放在控制器中并基本上调用 BlogPost.new 后跟 BlogPost.save ?不过,对启动验证感到紧张。我可以我可以做到, :validate =&gt; false,但如果我也将验证作为数据库约束(最佳实践),我会遇到问题还是取决于我使用savesave!
  • 我不确定我是否遵循。你指的是把控制器放在什么地方?您可以在创建之前生成一个 ID,如果您真的必须(锁定数据库中的专用序列表,选择其最高 ID,增加该数字,将其写回表并解锁表),但老实说,我只是避免尝试如果您关心性能,则优化第二次保存。
  • 谢谢,性能没有问题,保存两次就可以了。只是想确保我知道将代码放在哪里。控制器使用 .new 实例化对象,但回调在模型中,我并不清楚两次保存的代码/位置。
  • 只需从 after_create 挂钩中调用第二次保存。没关系,因为第二次保存不会触发该钩子;)
  • 太棒了。公认。对savesave! 有什么偏好吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2014-11-30
  • 2018-05-28
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多