Andrew Edwards wrote:> Hi,
> 
> I am trying to work out the best way to designate a member of a
> has_many relationship with a specific responsibility. In this instance
> I have a customer model with many addresses, however I need to flag
> one of them as the billing address.
> 
> Every customer must have a single billing address. If only one address
> is present in the addresses collection, by definition this would also
> be flagged as the billing address.
> 
> I am struggling to find a clean looking way of doing this. I have come
> up with the following model associations. Within the user interface
> you can select any member of the addresses collection and assign it as
> the billing_address. On customer creation a single address is also
> captured, saved and assigned to the collection and also the
> billing_address field.
> 
> I assume I''ll also be putting in some validation logic to ensure
> billing_address is always a member of the addresses collection.
> 
> Has anyone tackled this a different way?
> 
> class Customer < ActiveRecord::Base
>    belongs_to :billing_address, :class_name => "Address"
>    has_many :addresses, :dependent => :destroy
> end
> 
> Thanks, Andrew.
I think this is pretty much the way I would do it.  The other 
alternatives a) having some kind of column in addresses such as
''role''
or b) creating a third table both seem poorer then what you''ve got.
I would on the other hand design the customer class a little 
differently:
assuming a column in table customers called billing_address_id,
class Customer < ActiveRecord::Base
  has_many :addresses,
    :dependent => :destroy,
    :after_add=>:insure_billing_address
  do #block for has_many :addresses
    def billing
      find(proxy_target[:billing_address_id])
    end
  end
  #callback for addressed:after_add.  Sets the billing address to the 
new
  #address if there is not yet a billing address assigned.
  def insure_billing_address(address)
    self[:billing_address_id] = address[:id] unless 
self[:billing_address_id]
  end
end
This would allow something like:
  customer = Customer.find :first #etc...
  send_bill_to(customer.addresses.billing)
-- 
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---