Ruby on Rails模型/数据库关联

时间:2011-06-03 05:46:51

标签: ruby-on-rails associations

我有用户模型,农民模型,医生模型和教育模式。

农民有一个用户和许多教育。

医生有一个用户和许多教育。

如何为教育模型设置数据库?

它应该有一个farmer_id和一个doctor_id吗?

但是,教育不能同时属于农民和医生。它是一个或另一个。

所以我的教育数据库条目要么填写了farm_id,要么填写了doctor_id,但不是两者都填写。

有没有办法保证一次只能填写一个ID?

或者有更好的方法来关联这些模型吗?

您的帮助将不胜感激!

哦,不要担心模特的名字(农夫,医生等)。这只是一个例子。

2 个答案:

答案 0 :(得分:2)

我认为根据角色以这种方式建立关系是恰当的。

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

这样您就可以将user_id存储在教育对象中,从而解决您的问题。

答案 1 :(得分:2)

我为这种情况看到了两种可能的解决方案。

第一个是利用多态关联进行教育。这看起来像这样:

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

因此,不是教育有doctor_id或者是farmer_id,而是有一个profession_id和一个profession_type。

第二种解决方案是使用单表继承。在你的场景中,这可以通过让医生成为用户而不是属于用户来实现。对农民来说当然也是一样的。这看起来像这样:

class User < ActiveRecord::Base
  has_many :educations
end

class Farmer < User
end

class Doctor < User
end

class Education < ActiveRecord::Base
  belongs_to :user
end

在这种情况下,您可以向User模型添加一个类型列,以存储它是什么类型的类,然后在Education模型中只有user_id