gpt4 book ai didi

ruby - 正确的设计 : Including module in ActiveRecord or helper method

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:54 24 4
gpt4 key购买 nike

我有一个使用 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

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

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

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

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

这可能完全取决于个人喜好,但我很想知道其他人是如何做到这一点的,以及是否感觉这样做是“正确的”方式。

谢谢

最佳答案

老实说,我看不出您所做的有任何实际问题。 也许调用方法 fingerprint_sha 来防止破坏,也许 添加一个自定义异常,这样如果出现任何问题,您就知道它是从您的代码开始的,并且不是 AR。

就我个人而言,我可能会把它做成一个帮助程序并传入关系,如果在帮助程序中为其他人定义该方法的位置可能会更明显,但就像我说的那样我没有看到问题与您所做的一切并认为这是一个很好的解决方案。

也许其他人会提出不同意见,我们都会在这里学到一些东西:)

关于ruby - 正确的设计 : Including module in ActiveRecord or helper method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com