taslamの日記

>>mizincogrammerに移転しました。こちらは、今後更新されません。<<

2008-07-09

[][][]タグのバージョニング

acts_as_versionedは、モデルのバージョニングを手軽に実現できるプラグイン

acts_as_taggable_on_steroidsは、タグを手軽に実現できるプラグイン

併用したとき、モデルのバージョンを戻すと同時にタグもその時点のものに戻したいと思うのが人情というもの。

方法

acts_as_taggable_on_steroidsのタグリストのキャッシュ機能を利用すれば簡単に実装できる。

試した環境

Rails 2.0.2(Rails 2.1用のacts_as_versionedはまだ試したことない)

コード

class Item < ActiveRecord::Base
  acts_as_versioned
  acts_as_taggable

  # revert_toで、cached_tag_listからtag_listを復元する
  # (cached_tag_listがないとダメだよ)
  alias :revert_to_without_taggable :revert_to
  def revert_to_with_taggable(version)
    if revert_to_without_taggable(version)
      self.tag_list = cached_tag_list
      true
    else
      false
    end
  end
  alias :revert_to :revert_to_with_taggable
end

2008-03-26

[][]いまさらActsAsVersioned

やっぱり便利ですね。

既存のアプリインストール

script/plugin install acts_as_versioned

モデルにacts_as_versionedを追記。

class Entry < ActiveRecord::Base
  acts_as_versioned

end

マイグレーションを追加。

require 'entry'
class CreateEntryVersions < ActiveRecord::Migration
  def self.up
    Entry.create_versioned_table
    Entry.transaction do
      Entry.find(:all).each do |entry|
        entry.version = 1
        entry.save_version
      end
    end
  end
  
  def self.down
    Entry.drop_versioned_table
  end
end
rake db:migrate

使い方

acts_as_versioned RDOC

RoR Wiki 翻訳 Wiki

ちょっとしたこと

バージョンを戻して保存するとき、新しいバージョンを生成しない

普通にrevert_to、versionとしたのでは戻す操作で新しいバージョンをつくってしまう。

puts entry.versions.reload.size # => 2
puts entry.version              # => 2
entry.revert_to(1)
puts entry.version              # => 2
entry.save
puts entry.versions.reload.size # => 3
puts entry.version              # => 3

これが気に食わないときは、revert_to!を使う。

puts entry.versions.reload.size # => 2
puts entry.version              # => 2
entry.revert_to!(1)
puts entry.versions.reload.size # => 2
puts entry.version              # => 1
TIPS

こちらのエントリも参考になる。

いまさら感もあるけれど・・内部を理解する