The dirty plugin makes Sequel save the initial value of a column when setting a new value for the column. This makes it easier to see what changes were made to the object:
artist.name # => 'Foo' artist.name = 'Bar' artist.initial_value(:name) # 'Foo' artist.column_change(:name) # ['Foo', 'Bar'] artist.column_changes # {:name => ['Foo', 'Bar']} artist.column_changed?(:name) # true artist.reset_column(:name) artist.name # => 'Foo' artist.column_changed?(:name) # false
It also makes changed_columns more accurate in that it can detect when a the column value is changed and then changed back:
artist.name # => 'Foo' artist.name = 'Bar' artist.changed_columns # => [:name] artist.name = 'Foo' artist.changed_columns # => []
It can handle situations where a column value is modified in place:
artist.will_change_column(:name) artist.name.gsub!(/o/, 'u') artist.changed_columns # => [:name] artist.initial_value(:name) # => 'Foo' artist.column_change(:name) # => ['Foo', 'Fuu']
It also saves the previously changed values after an update:
artist.update(:name=>'Bar') artist.column_changes # => {} artist.previous_changes # => {:name=>['Foo', 'Bar']}
Usage:
# Make all model subclass instances record previous values (called before loading subclasses) Sequel::Model.plugin :dirty # Make the Album class record previous values Album.plugin :dirty