开发者

Ruby on Rails Model / Database Associations

I have a user model, farmer model, doctor model, and education model.

A farmer has a user and many educations.

A doctor has a user and many educations.

How do I setup the database for the education model?

Shoul开发者_JAVA百科d it have a farmer_id AND a doctor_id?

But a education cannot belong to a farmer AND and doctor at the same time. It's one or the other.

So my education database entry would either have a farmer_id OR a doctor_id filled in, but not both.

Is there a way to guarantee that only one of the ids could be filled in at a time?

Or is there a better way to associate these models?

Your help would be appreciated!

Oh, and don't worry about the names of the models (farmer, doctor, etc.). It's just an example.


I see two possible solutions for this scenario.

The first one is to make use of polymorphic associations for education. That could look like this:

class Farmer < ActiveRecord::Base
  belongs_to :user
  has_many :educations, :as => :profession
end

class Doctor < ActiveRecord::Base
  belongs_to :user
  has_many :educations, :as => :profession
end

class Education < ActiveRecord::Base
  belongs_to :profession, :polymorphic => true
end

So instead of education having a doctor_id or a farmer_id it has one profession_id and one profession_type.

The second solution would be to make use of Single Table Inheritance. And in your scenrio, that could be accomplished by letting a Doctor be a User instead of belonging to a User. And of course the same thing for a Farmer. That could look like this:

class User < ActiveRecord::Base
  has_many :educations
end

class Farmer < User
end

class Doctor < User
end

class Education < ActiveRecord::Base
  belongs_to :user
end

And in this scenario you would add a type column to the User model to store what type of class it is and then only having a user_id in the Education model


I think its appropriate to have the relations this way based on roles.

Class User
  has_one :role
  has_many :educations
end

Class Role
  #What ever roles you have.
  #Farmer or Doctor
  belongs_to :user
end


class Education
  belongs_to :user
end

This way you will store the user_id in the education object, which solves your problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜