Skip to content
This repository has been archived by the owner on Dec 12, 2021. It is now read-only.

Commit

Permalink
unfreeze association
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanb committed Jul 14, 2008
1 parent 8d7e3d1 commit 59ce88e
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
25 changes: 13 additions & 12 deletions lib/association_freezer/belongs_to_freezer.rb
Expand Up @@ -6,36 +6,37 @@ def initialize(owner, reflection)
end

def freeze
freeze_to_db(Marshal.dump(nonfrozen.attributes))
self.frozen_data = Marshal.dump(nonfrozen.attributes)
end

def unfreeze
# TODO
@frozen = nil
self.frozen_data = nil
end

def fetch(*args)
frozen(*args) || nonfrozen(*args)
frozen || nonfrozen(*args)
end

def frozen(force_reload = false)
if @frozen && !force_reload
@frozen
elsif frozen_in_db
@frozen = target_class.new(Marshal.load(frozen_in_db).except('id')).freeze
end
private

def frozen
@frozen ||= load_frozen if frozen_data
end

private
def load_frozen
target_class.new(Marshal.load(frozen_data).except('id')).freeze
end

def nonfrozen(*args)
@owner.send("#{name}_without_frozen_check", *args)
end

def freeze_to_db(data)
def frozen_data=(data)
@owner.write_attribute("frozen_#{name}", data)
end

def frozen_in_db
def frozen_data
@owner.read_attribute("frozen_#{name}")
end

Expand Down
20 changes: 19 additions & 1 deletion spec/freezer_spec.rb
Expand Up @@ -52,14 +52,32 @@
@ship_method.should_not be_frozen
end

it "should still consider model frozen after reload" do
it "should still consider model frozen after reloading association" do
@order.ship_method(true).should be_frozen
end

it "should ignore changes to associated model" do
@ship_method.update_attribute(:price, 8)
@order.ship_method.price.should == 5
@order.ship_method(true).price.should == 5
end

it "should be frozen after reloading order" do
@order.save!
@order.reload
@order.ship_method.should be_frozen
end

it "should not be frozen when unfreezing" do
@order.unfreeze_ship_method
@order.ship_method.should_not be_frozen
end

it "should restore original attributes when unfreezing" do
@ship_method.update_attribute(:price, 8)
@order.unfreeze_ship_method
@order.ship_method.price.should == 8
end
end
end
end

0 comments on commit 59ce88e

Please sign in to comment.