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.
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,
Marnen Laibow-Koser
http://www.marnen.org
[email protected]
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…?