2

我有一个使用 ActiveRecord 的 Sinatra 应用程序,我希望添加一个可以为一组记录生成指纹 (SHA1) 的功能。

我实现这一点的方式是定义一个模块并将其包含在ActiveRecord::Relation如下:

module Fingerprints
  def sha1
    Digest::SHA1.hexdigest map{ |record| record.attributes.values.join }.join
  end
end

ActiveRecord::Relation.send :include, Fingerprints

我现在可以在 a 上调​​用 'sha1'ActiveRecord::Relation并获得我需要的值。

我的问题是这是否是执行此操作的“首选”方式(使用附加功能扩展 ActiveRecord)?

使用的最后一行send对我来说感觉不干净,而且我将功能固定到一个不属于我自己的类的简单事实也感觉像一个 hack。我知道这是 Ruby 中的标准模式,但深入到 ActiveRecords 的胆量并以这种方式修补它对我来说并不熟悉。

另一种方法是创建一个接收 aActiveRecord::Relation并返回指纹的 Sinatra 助手。虽然这感觉更干净,但我不禁觉得该sha1方法应该真正属于ActiveRecord::Relation该类以更好地描述它的意图。

这可能只是个人喜好,但我很想知道其他人是如何做到这一点的,以及是否有一种“正确”的感觉。

谢谢

4

1 回答 1

0

老实说,我看不出你所做的有任何真正的问题。也许调用该方法fingerprint_sha来防止破坏,也许添加一个自定义异常,这样如果发生任何问题,您就知道它是在您的代码中开始的,而不是 AR 的。

就个人而言,我可能会将此作为帮助程序并传递关系,如果在帮助程序中为其他人定义该方法可能会更明显,但就像我说的那样,我看不出你的问题'已经完成并认为这是一个很好的解决方案。

也许其他人会过来说不同的东西,我们都会在这里学到一些东西:)

于 2013-02-14T12:01:46.447 回答