我有一个使用 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
该类以更好地描述它的意图。
这可能只是个人喜好,但我很想知道其他人是如何做到这一点的,以及是否有一种“正确”的感觉。
谢谢