Highlight member of has_many association

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.

Andrew E. 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)