我有一个使用ActiveRecord的Sinatra应用程序,我希望添加一个功能,可以为一组记录生成指纹(SHA1)。正确的设计:在ActiveRecord或辅助方法中包含模块
我实现这一点的方式是通过定义模块和包括内ActiveRecord::Relation
,如下所示:
module Fingerprints
def sha1
Digest::SHA1.hexdigest map{ |record| record.attributes.values.join }.join
end
end
ActiveRecord::Relation.send :include, Fingerprints
我现在可以称之为“SHA1”上ActiveRecord::Relation
得到我所需要的价值。
我的问题是这是否是“首选”的方式来做到这一点(扩展ActiveRecord与额外的功能)?
使用send
的最后一行对我来说感觉不太清楚,简单的事实是,我将特征绑定到不属于我自己的类上的特征也感觉像是黑客。我知道这是Ruby中的一种标准模式,但以这种方式进入ActiveRecords的内核并修补它对我来说是陌生的。
另一种方法是创建一个需要ActiveRecord::Relation
并返回指纹的Sinatra助手。虽然这感觉更清洁,但我不禁感到sha1
方法应该属于ActiveRecord::Relation
类,以更好地描述它的意图。
这可能只是个人喜好,但我会对其他人如何做这件事感兴趣,以及是否有这样做的“正确”方式的感觉。
感谢
为什么把它添加到ActiveRecord的时候可以将其添加到各个模型类? – iain 2013-02-14 00:50:48
因为我希望能够为一组记录生成指纹。例如,当您执行'Model.scoped'时,将返回一个包含模型对象的'ActiveRecord :: Relation'实例。这是我想为其生成指纹的集合,而不是单个模型(我已经为单个模型添加了指纹识别) – 2013-02-14 10:12:58