2

名前、電話、メールの3 つの属性を持つ Client というモデルがあります。最初に、 Mark、+54261334455、および fake@client.com という 値を持つクライアントのインスタンスがあります。次に、これらの値をPeter, +54261444444, another@mail.comに変更しますが、古い値を保持する必要があります。これどうやってするの?

私のオプション:

  1. old_attr 列を作成します: name、phone、email、old_name、old_phone、および old_email。これは醜い解決策だと思います...
  2. serializeを使用して、追加のフィールドのみを持つ古いデータを永続化します: name、phone、email、および data。古いデータを何度も操作する必要があるため、これは良い考えではないと思います。
  3. Client の 2 つのインスタンスを作成します。1 つは古いデータで、もう 1 つは新しいデータで、これらのオブジェクトを関連付けるためにクライアント モデルに追加のフィールドを追加します。これはより良い解決策だと思いますが、「1つのクライアント」を2つに分割するため、多くのロジックを追加する必要があります

これを行うためのより良いアイデアはありますか?

4

2 に答える 2

1

オプション 4:適切な を参照する列を追加して、ClientHistoryと同一のモデルを作成します。次に、コールバックは次のようになります。Clientclient_idClientbefore_save

before_save :track_history

def track_history
    return if(new_record? || !changed?)
    old = Hash[attribute_names.map { |name| [name == 'id' ? 'client_id' : name, self.send("#{name}_was")] }]
    ClientHistory.create!(old)
end

もちろん、コールのオプションにnew_record? || !changed?プッシュできます。もちろん、より多くのものを除外するために をフィルタリングしたり、変更されたものだけを追跡したりしたい場合があります。これらはどちらも非常に些細な変更です (ただし、toおよび from遷移を追跡する方法には注意してください)。:ifbefore_saveattribute_namesnilnil

于 2013-07-13T04:56:32.350 に答える
1

あなたの状況ではやり過ぎかもしれませんが、優れた ActiveRecord バージョン管理ツールがいくつかあります。特定のレコードに加えられた変更を追跡し、値を以前のバージョンにリセットすることもできます。

私が知っている最良の解決策の1つはpaper_trail です

于 2013-07-13T05:16:46.627 に答える