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

これで、で「sha1」を呼び出して、ActiveRecord::Relation必要な値を取得できます。

私の質問は、これがこれを行うための「好ましい」方法であるかどうかです(追加機能でActiveRecordを拡張する)?

使用する最後の行はsend私には不潔に感じ、私が自分のものではないクラスに機能をボルトで固定しているという単純な事実もハックのように感じます。これがRubyの標準パターンであることは知っていますが、ActiveRecordsの根性に到達し、この方法でパッチを適用することは私にはなじみがありません。

ActiveRecord::Relation別の方法は、指紋を取得して返すSinatraヘルパーを作成することです。これはすっきりしているように感じますが、その意図をよりよく説明するために、sha1メソッドが実際にクラスに属している必要があると感じずにはいられません。ActiveRecord::Relation

これは単に個人的な好みによるかもしれませんが、他の人がこれをどのように行うか、そしてこれが行われる「正しい」方法の感覚があるかどうかに興味があります。

ありがとう

4

1 に答える 1

0

正直なところ、あなたが行ったことに実際の問題は見られません。おそらくfingerprint_sha、クロバリングを防ぐためメソッドを呼び出し、カスタム例外を追加して、問題が発生した場合に、AR ではなくコードで開始されたことを認識できるようにします。

個人的には、おそらくこれをヘルパーにしてリレーションを渡したでしょう。ヘルパー内にある場合は、メソッドが他の人のために定義された場所がより明確になる可能性がありますが、私が言うように、あなたが何の問題も見られませんやったし、それは良い解決策だと思います。

多分他の誰かがやってきて違うことを言うかもしれません、そして私たちはここで何かを学ぶでしょう:)

于 2013-02-14T12:01:46.447 に答える