Those won't make it immutable, but the key does need to be unique. So,
unless you can only have ONE Loan per Person you should probably
change those too. Rather than making them keys you probably mean to
have them as indexes, which I DataMapper does for you, and add an :id
Serial primary key to the model, the same as it is in your MoneyFlow
model.

On Jan 12, 12:28 am, Zhi-Qiang Lei <[email protected]> wrote:
> 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 
> > 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.

Reply via email to