问题
I've been playing around with STI and belongs_to / has_many relationships and I'm a bit confused.
I have a few questions based on a model configuration similar to:
class Parental < ActiveRecord::Base
end
class Mother < Parental
has_many :babies
end
class Father < Parental
has_many :babies
end
class Baby < ActiveRecord::Base
belongs_to :??????
end
- What should
Baby
belong_to? - In terms of a migration, what should i name/add for foreign key on
the
babies
table? - I've had a hard time researching this, is there a definitive source that explains this? The API docs did not seem to hit it on the head OR i missed it (which is totally possible).
My first thought is add parental_id
to babies
along with a method like Baby#owner
that does the following:
- Hits self.parental
- Determines the parental's type
- Returns the correct type of parental (could be a mother, could be a father)
Thank you!
回答1:
The Baby
belongs to both Mother
and Father
belongs_to :mother
belongs_to :father
You can have multiple foreign keys. The Baby
DB table then has two fields, mother_id
and father_id
The definitive guide to associations is here: http://guides.rubyonrails.org/association_basics.html
The migration to create the Baby
class would look something like this:
class CreateBabies < ActiveRecord::Migration
def self.up
create_table :babies do |t|
t.integer :father_id
t.integer :mother_id
end
end
def self.down
drop_table :babies
end
end
This gives you things like:
baby.mother
and baby.father
. You can't have a single parental_id
because the foreign key can only point to one other record, meaning that babies would only have one parent (when really they have two).
Seems like, in this case, you're just misunderstanding the relationship, is all. You are on the right track.
回答2:
I've solved a similar problem myself by adding an explicit foreign_key call.
Something like the following code:
class Parental < ActiveRecord::Base
end
class Mother < Parental
has_many :babies
end
class Father < Parental
has_many :babies
end
class Baby < ActiveRecord::Base
belongs_to :mother, foreign_key: 'parental_id'
belongs_to :father, foreign_key: 'parental_id'
end
Of course, this assumes that a baby has only one parent. :-)
来源:https://stackoverflow.com/questions/7457070/rails-question-belongs-to-with-sti-how-do-i-do-this-correctly