Ruby on Rails Friday, May 25, 2012

Colin,

Thanks for taking a look at this.  After a good night's sleep, I came back to this, and the problem appears to be
 that  I need to self.reload after the loop.  I believe this is because of the nature of the association, which depend on whether
debit is true or false, and I believe need re-reading from the db after the e.save.

For anyone interested, here is what fixed it:

  if num_nils == 1
      # Set the sole nil entry to amount needed to balance Transaction
      plug = debit_total - credit_total
      entries.where(:amount => nil).each do |e|
        e.amount = plug.abs
        e.debit = (plug < 0)
        e.save
      end
      reload    # <= New line
    end

Th

On Friday, May 25, 2012 2:35:08 AM UTC-5, Colin Law wrote:


> All,
>
> I posted this over on comp.lang.ruby, but realized I should probably
> keep Rails questions to this group, so soory for the cross-post.
>
> I have a rails app with a Transaction class that has_many :entries.
> Each Transaction has many entries, and those with the debit attribute
> true are debits, false are credits.  It starts like this.
>
> class Transaction < ActiveRecord::Base
>  has_many :entries
>  has_many :debits, :class_name => 'Entry', :conditions => {:debit =>
> true}
>  has_many :credits, :class_name => 'Entry', :conditions => {:debit =>
> false}
> end
>
> I want to be able to complete an Transaction if there is exactly one
> Entry that has its amount set to nil.  I want to set that amount to a
> debit or credit of the proper amount to make the Transaction balance.
>
> Sounded easy to me, but I am having trouble with my balance! method.
> The relevant part of it is:
>
>  def balance!
>    ...
>    if num_nils == 1
>      # Set the sole nil entry to amount needed to balance Transaction
>      plug = debit_total - credit_total
>      entries.where(:amount => nil).each do |e|
>        e.amount = plug.abs
>        e.debit = (plug < 0)
>        e.save
>      end
>    end
>
> The problem is that when I finish this, the entries associated with my
> Transaction are not affected.  I appears to make a copy, change it,
> and
> leave the Entry associated with my Transaction with a nil amount.
>
> What am I missing?

The first thing to determine is which bit is failing.  Is the code in
the each loop actually running?  Does the save work (check the return
code from save)?  Have a look at the Rails Guide on debugging for help
on how to debug the code.

Not directly related to the question but I find it hard to believe
that the way you are going about this is ideal.  I suggest it would be
better not do directly differentiate between debits and credits as you
are, but just to have positive or negative transaction values.
However as I know little about what you are trying to achieve this may
be incorrect.

Also I suspect that transaction may be a reserved word in rails, so
this might give you problems.

Colin

>
> Thanks,
>
> Dan Doherty
>
> --
> You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
> To post to this group, send email to rubyonrails-talk@googlegroups.com.
> To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
>

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/AgtjLjZuVVUJ.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

No comments:

Post a Comment