Hi, This model also has two more keys, they make a composite keys. This will also make it immutable?
>>>> belongs_to :loaner, Person, :key => true >>>> belongs_to :loanee, Person, :key => true On Jan 12, 2011, at 3:15 AM, RipTheJacker wrote: > Ok. It's because of this: > > property :currency, Enum[*CURRENCY_CODES], :key => true > > > You can't have :key => true on an Enum property since it is not > unique. > > > On Jan 10, 11:22 pm, Zhi-Qiang Lei <[email protected]> wrote: >> Hi, >> >> I still get the error with your spec code, here is the backtrace. >> >> Failures: >> >> 1) Loan#count! when a loan exists from giver to receiver >> Failure/Error: Loan.count!(money_flow) >> DataMapper::ImmutableError: >> Immutable resource cannot be modified >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/r >> esource/state/immutable.rb:16:in `set' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/dm-core-1.0.2/lib/dm-core/m >> odel/property.rb:251:in `amount=' >> # ./lib/models.rb:49:in `count!' >> # ./spec/models_spec.rb:64:in `block (4 levels) in <top (required)>' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-expectations-2.4.0/li >> b/rspec/matchers/change.rb:17:in `call' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-expectations-2.4.0/li >> b/rspec/matchers/change.rb:17:in `matches?' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-expectations-2.4.0/li >> b/rspec/expectations/handler.rb:34:in `handle_matcher' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-expectations-2.4.0/li >> b/rspec/expectations/extensions/kernel.rb:50:in `should_not' >> # ./spec/models_spec.rb:63:in `block (3 levels) in <top (required)>' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example.rb:49:in `instance_eval' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example.rb:49:in `block (2 levels) in run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example.rb:98:in `with_around_hooks' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example.rb:46:in `block in run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example.rb:91:in `block in with_pending_capture' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example.rb:90:in `catch' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example.rb:90:in `with_pending_capture' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example.rb:45:in `run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example_group.rb:261:in `block in run_examples' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example_group.rb:257:in `map' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example_group.rb:257:in `run_examples' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example_group.rb:231:in `run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example_group.rb:232:in `block in run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example_group.rb:232:in `map' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/example_group.rb:232:in `run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/command_line.rb:27:in `block (2 levels) in run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/command_line.rb:27:in `map' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/command_line.rb:27:in `block in run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/reporter.rb:12:in `report' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/command_line.rb:24:in `run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/runner.rb:55:in `run_in_process' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/runner.rb:46:in `run' >> # >> /Users/siegfried/.rvm/gems/ruby-1.9.2-p136/gems/rspec-core-2.4.0/lib/rspec/ >> core/runner.rb:10:in `block in autorun' >> >> On Jan 11, 2011, at 7:05 AM, RipTheJacker wrote: >> >> >> >> >> >>> You should probably just change that spec. The element that you want >>> to test is a proc (you hope) getting invoked inside of the subject >>> block, which is a weird pattern, and you don't need the #let blocks >>> really, since you only use those objects once. >> >>> Try: >> >>> describe "#count!" do >>> specify "when a loan exists from giver to receiver" do >>> loan = Loan.gen >>> money_flow = MoneyFlow.gen(:giver => loan.loaner, :receiver => >>> loan.loanee, :currency => loan.currency) >>> expect do >>> Loan.count!(money_flow) >>> end.to_not change(Loan, :count) >>> end >>> end >> >>> I'm assuming you are using rspec 2, though it will work in rspec 1.x >>> with a syntax change. If you still get that error, post the new >>> backtrace here. At the very least the spec and the backtrace will be >>> more meaningful this way, and may be easier to debug (I hope). >> >>> On Jan 10, 10:42 am, Zhi-Qiang Lei <[email protected]> wrote: >>>> Hi, >> >>>> I have some code as follow. >> >>>> class Loan >>>> include DataMapper::Resource >>>> belongs_to :loaner, Person, :key => true >>>> belongs_to :loanee, Person, :key => true >>>> property :currency, Enum[*CURRENCY_CODES], :key => true >>>> property :amount, Decimal, :scale => 2, :default => 0 >> >>>> def self.count!(money_flow) >>>> loan = get(money_flow.currency, money_flow.giver_id, >>>> money_flow.receiver_id) >>>> loan.amount += money_flow.amount >>>> end >> >>>> # more code... >>>> end >> >>>> class MoneyFlow >>>> include DataMapper::Resource >>>> belongs_to :giver, Person >>>> belongs_to :receiver, Person >> >>>> property :id, Serial >>>> property :amount, Decimal, :scale => 2, :min => 0.01 >>>> property :currency, Enum[*CURRENCY_CODES], :default => :CNY >> >>>> # more code... >>>> end >> >>>> When I test the "count!" class method as follow: >> >>>> describe "#count!" do >>>> subject { lambda { Loan.count!(money_flow) } } >>>> context "when a loan exists from giver to receiver" do >>>> let!(:loan) { Loan.gen } >>>> let(:money_flow) { MoneyFlow.gen(:giver => loan.loaner, :receiver => >>>> loan.loanee, :currency => loan.currency) } >>>> it { should_not change(Loan, :count) } >>>> end >>>> end >> >>>> It tells me I got a Immutable Error. I feel strange on that. They have >>>> keys, and I didn't destroy the record. Can you see why? Thanks. >> >>>> 1) Loan#count! when a loan exists from giver to receiver >>>> Failure/Error: subject { lambda { Loan.count!(money_flow) } } >>>> DataMapper::ImmutableError: >>>> Immutable resource cannot be modified >>>> # ./lib/models.rb:49:in `count!' >>>> # ./spec/models_spec.rb:59:in `block (4 levels) in <top (required)>' >>>> # ./spec/models_spec.rb:63:in `block (4 levels) in <top (required)>' >> >>>> On Jan 10, 2011, at 11:34 PM, Ted Han wrote: >> >>>>> Objects are immutable when they've been deleted or frozen for some >>>>> reason. Deleting a record from your data store will always result in >>>>> that record being frozen. >> >>>>> Is there a specific problem that you're having? >> >>>>> -T >> >>>>> On Mon, Jan 10, 2011 at 10:23 AM, Zhi-Qiang Lei <[email protected]> >>>>> wrote: >>>>> Dear All, >> >>>>> Could anyone answer me when a resource should be immutable? And why? >>>>> Thanks. >> >>>>> Best regards, >>>>> Zhi-Qiang Lei >>>>> [email protected] >> >>>>> -- >>>>> You received this message because you are subscribed to the Google Groups >>>>> "DataMapper" group. >>>>> To post to this group, send email to [email protected]. >>>>> To unsubscribe from this group, send email to >>>>> [email protected]. >>>>> For more options, visit this group >>>>> athttp://groups.google.com/group/datamapper?hl=en. >> >>>>> -- >>>>> You received this message because you are subscribed to the Google Groups >>>>> "DataMapper" group. >>>>> To post to this group, send email to [email protected]. >>>>> To unsubscribe from this group, send email to >>>>> [email protected]. >>>>> For more options, visit this group >>>>> athttp://groups.google.com/group/datamapper?hl=en. >> >>>> Best regards, >>>> Zhi-Qiang Lei >>>> [email protected] >> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "DataMapper" group. >>> To post to this group, send email to [email protected]. >>> To unsubscribe from this group, send email to >>> [email protected]. >>> For more options, visit this group >>> athttp://groups.google.com/group/datamapper?hl=en. >> >> Best regards, >> Zhi-Qiang Lei >> [email protected] > > -- > You received this message because you are subscribed to the Google Groups > "DataMapper" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/datamapper?hl=en. > Best regards, Zhi-Qiang Lei [email protected] -- You received this message because you are subscribed to the Google Groups "DataMapper" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/datamapper?hl=en.
