difference between belongs_to and references keyword?

First, I am very new to ruby and rails. Searching for "references" is really tough, and so I've finally come here.

I'm trying to create a scaffold. Let's say a Business and a School both can have a single Address (not shared). In a different case, an Offer has an OfferType (with just a type_id and description). Also, a Business can have many Offers.

(I've stripped off most of the unrelated columns, like last_name, etc...)

I'm wondering (in about this order):

a) Am I doing this right?

b) What the difference would be if I used Address business:belongs_to user:belongs_to instead of references?

c) Is the Business address:has_one redundant with Address business:references? If not, what does it do? What about the has_many?

d) Will this generate join tables for me? And I don't need to specify xxxxx_id's anywhere in these relationships?

./script/generate scaffold Business address:has_one offer:has_many name:string first_name:string

./script/generate scaffold School address:has_one name:string

./script/generate scaffold Address business:references school:references address1:string

./script/generate scaffold Offer business:references offerType:has_one start_date:datetime

./script/generate scaffold OfferType image:has_one name:string description:text

(I'm on Ruby 1.8.7 and Rails 2.3.8.)

Thanks!

Kevin Hastie wrote:

a) Am I doing this right?

Apparently not.

Weird. Is it because I didn't do polymorphic anywhere that Address now has a business_id, a credit_card_id and a user_id? Obviously this is no good - I'd prefer the Business table to have an address_id, etc.... So:

e) Did I do this backwards? Should it be Business address:references (or address:belongs_to?) and Address business:has_one?

f) Or should I just drop the :references from Addresses and go from there?

g) Is using :references (which I don't see in many docs/tutorials) just going to get me in trouble as a beginner?

Thanks again!

Kevin Hastie wrote:

I guess what I really want is something like this:

class Address< ActiveRecord::Base   belongs_to :addressable, :polymorphic => true end

class Business< ActiveRecord::Base has_one :address, :as => :addressable end

class School < ActiveRecord::Base has_one :address, :as => :addressable end

h) I don't suppose there is a way to do that with the scaffold. Is there a typical set of scaffold options that would map to this?

i) Lastly, I guess I am better off avoiding polymorphism at the beginning, huh? I should just be doing a simple mapping...

I've written a short example about has_many, belongs_to - http://gist.github.com/425026

has_many, has_one, belongs_to deffinitions goes into model and not in scaffold. You can use "references" like this: script/generate scaffold address company:references address:text

but as I mentioned in this discussion http://railsforum.com/viewtopic.php?id=39325 (look for andain's posts) I'm running into problems where views are generated without appended _id. Maybe I'm just doing something wrong or just not getting it right ...

Anyway I hope i shed some light on your problem.

Correction to my previuos message: you can use "belongs_to" and "references" as column types in scaffold (and migrations). They do same thing: add belongs_to association to model.

Kevin Hastie wrote:

Kevin Hastie wrote:

I guess what I really want is something like this:

class Address< ActiveRecord::Base   belongs_to :addressable, :polymorphic => true end

class Business< ActiveRecord::Base has_one :address, :as => :addressable end

class School < ActiveRecord::Base has_one :address, :as => :addressable end

h) I don't suppose there is a way to do that with the scaffold. Is there a typical set of scaffold options that would map to this?

i) Lastly, I guess I am better off avoiding polymorphism at the beginning, huh? I should just be doing a simple mapping...

What about the polymorphic example I gave? It seems like this is the best practice approach, but I am finding it VERY hard to find examples that I can get to work, and I feel like I see lots of complaints that the feature is "broken" within Rails.

Is it only for has_many relationships or can it be used like I am trying with has_one relationships? Is my example the correct way to go about it? If so, what else needs to happen?

(and what about questions h and i?)

j) What seems much easier is to have the Business and School tables to each have an address_id, and be done with it. That's what I would have done days ago were I programming a language without so many "handy" shortcuts. But to do so, doesn't it have to be

Address has_one :business has_one :school

Business belongs_to :address

That doesn't seem right..?

i am interested in the answer to this as well.

please post if you find out.

Kevin Hastie wrote: [...]

j) What seems much easier is to have the Business and School tables to each have an address_id, and be done with it.

That's correct.

That's what I would have done days ago were I programming a language without so many "handy" shortcuts. But to do so, doesn't it have to be

Address has_one :business has_one :school

Business belongs_to :address

That doesn't seem right..?

That's only right if you want an address to treat associated businesses and schools differently. If you just want an address to have_one (or more likely many) associated generic entities, then you need polymorphism.

Best,