sanity check on setting up relationships please

I hate having to ask this but my eyeballs are spinning and I seem to be getting some odd behavior.

a bit of the schema:

create_table "orders", :force => true do |t|   t.column "billing_address_id", :integer   ... end

# single table inheritance here... AddressBilling & AddressShipping create_table "addresses", :force => true do |t   t.column "type", :string, :limit => 20   .... end

which of these pairs is correct?

class Order < ActiveRecord::Base   has_one :billing_address,                  :class_name => "AddressBilling" end

class AddressBilling < Address   belongs_to :order end

------- OR ----------------

class Order < ActiveRecord::Base   belongs_to :billing_address,                     :class_name => "AddressBilling" end

class AddressBilling < Address   has_one :order end

I thought the first was the correct but I'm a noob and neither seem to be working as I'd expect.

When I do this in the controller: @orders = Order.find(:all)

then in the view: <% @orders.each do |order| %> <tr><td><%= order.billing_address_id %></td></tr> <% end %>

that works fine but then if I do this: <% @orders.each do |order| %> <tr><td><%= order.billing_address.id %></td></tr> <% end %>

I get an error about billing address being a nil object? Yes the billing address is there with the correct id.

seems odd to me... any help greatly appreciated and thanks in advance! Tim

I hate having to ask this but my eyeballs are spinning and I seem to be getting some odd behavior.

a bit of the schema:

create_table "orders", :force => true do |t|   t.column "billing_address_id", :integer   ... end

# single table inheritance here... AddressBilling & AddressShipping create_table "addresses", :force => true do |t   t.column "type", :string, :limit => 20   .... end

which of these pairs is correct?

class Order < ActiveRecord::Base   has_one :billing_address,                  :class_name => "AddressBilling" end

class AddressBilling < Address   belongs_to :order end

------- OR ----------------

class Order < ActiveRecord::Base   belongs_to :billing_address,                     :class_name => "AddressBilling" end

class AddressBilling < Address   has_one :order end

I thought the first was the correct but I'm a noob and neither seem to be working as I'd expect.

The second one is correct. While "Order HAS ONE billing address" seems to read more logically, keep in mind that the has_one, belongs_to stuff is really only there to tell AR about the relationships, not to be semantically correct.

Think of it in this way: does the order need to know about its billing address, or does a billing address need to know about its order? The answer should be the former - an order needs to know where it should be shipped to, more than an address needs to know what should be shipped to it (see how that makes for awkward language as well?). From this it follows that an order belongs_to a billing address.

The belongs_to side of the association is the one that stores the foreign key. Consider the case (in the near future), where you have repeat customers and you want to reuse their addresses. Then, the has_one :order in the address object turns into a has_many :orders.

Cheers, Max