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
これで、で「sha1」を呼び出して、ActiveRecord::Relation
必要な値を取得できます。
私の質問は、これがこれを行うための「好ましい」方法であるかどうかです(追加機能でActiveRecordを拡張する)?
使用する最後の行はsend
私には不潔に感じ、私が自分のものではないクラスに機能をボルトで固定しているという単純な事実もハックのように感じます。これがRubyの標準パターンであることは知っていますが、ActiveRecordsの根性に到達し、この方法でパッチを適用することは私にはなじみがありません。
ActiveRecord::Relation
別の方法は、指紋を取得して返すSinatraヘルパーを作成することです。これはすっきりしているように感じますが、その意図をよりよく説明するために、sha1
メソッドが実際にクラスに属している必要があると感じずにはいられません。ActiveRecord::Relation
これは単に個人的な好みによるかもしれませんが、他の人がこれをどのように行うか、そしてこれが行われる「正しい」方法の感覚があるかどうかに興味があります。
ありがとう