3

そのため、次のようなコードを書いていることがよくあります。

song.rb:

:before_save :cache_sortable_name

private

def cache_sortable_name
  return unless name_changed?
  self.sortable_name = name.sub(/^(the|a|an)\s+/i, '')
end

つまり、利便性のために非正規化されたデータを保持するsortable_nameデータベース列があり、モデルの名前が変更されるたびにデータを入力したいと考えています。

このロジックをこのような構造にカプセル化できるようにしたいと思います

:cache_in_database :sortable_name do
  name.sub(/^(the|a|an)\s+/i, '')
end

か何か。これは存在しますか?

4

1 に答える 1

1

だから...属性とブロックを取り、各保存の前にブロックの戻り値に属性を設定する「cache_in_database」と呼ばれるコールバックが必要です。そうですか?

そのようなことは聞いたことがありませんが、簡単に作成できるプラグインです。属性とブロック パラメーターを受け取る cache_in_databaseクラス メソッドを記述し、代入を行う proc またはメソッドを作成し、それをbefore_saveチェーンに追加するだけです。私への質問は、毎回コードを 1 行ほど節約する魔法を追加する価値があるほど頻繁にこれを行うかどうかです。

于 2009-09-25T01:19:52.723 に答える