Ruby on Rails:在has_many:through和simply has_many之间进行选择

时间:2014-08-10 03:31:18

标签: ruby-on-rails ruby activerecord has-many-through has-many

我正在尝试创建一个linkedin克隆,用户可以在其中拥有多种技能。他们还可以对每种技能进行描述,并选择技能是他们的主要技能还是辅助技能(他们只能拥有一项技能)。

我无法决定是否只使用has_many或has_many:through。

如果我使用has_many

class Skill < ActiveRecord::Base
    belongs_to :user

    validates :description, presence: true
    validates :name, presence: true
end

class User < ActiveRecord::Base
    has_many :skills, dependent: :destroy
end

技能表还将包含主要和次要列,它们是布尔值。


如果我使用has_many:通过

class Skill < ActiveRecord::Base
    has_many :users, through: :users_skills
    has_many :users_skills
end

class UsersSkill < ActiveRecord::Base
    belongs_to :user
    belongs_to :skill
end

class User < ActiveRecord:Base
    has_many :skills, through: :users_skills
    has_many :users_skills
end

在这里,我将在UsersSkill模型中拥有主要和次要布尔列。

您认为哪个是更好的选择?

2 个答案:

答案 0 :(得分:0)

基于您声明的要求:

  

我主要希望人们能够输入搜索技能   有这种技能的人

  

他们也可以对每项技能进行描述并选择是否   技能是他们的主要技能或辅助技能(他们只能拥有   其中一个)。

仅仅是我对模型意义的理解,即“技能”不一定属于单个用户 - 我会选择has_many:through。

原因在于技能是独立的(正如你所说,你希望能够搜索它们)。仅仅因为一个人列出了“擦洗地板”作为他们的主要技能,而另一个人作为他们的辅助技能,并不意味着你应该有两个带有“擦洗地板”的条目。拥有一个技能,并使用UsersSkills将其分配给多个用户,以及特定于该用户的技能实例的任何信息。

您可以将主要/次要排名放在users_skills表上。如果您需要扩展存储在这些映射中的信息,此模型的存在还将为您节省大量的工作。

答案 1 :(得分:0)

最重要的是,选择取决于系统的一项功能 - 用户的技能是否特定于他们,或者更广泛的群体的一部分

  
      
  • 如果您的用户自己添加技能, has_many 关系会很好
  •   
  • has_many :through 关系如果您的用户的技能可以从更广泛的池中选择将会很好
  •   

-

<强>系统

您必须记住,由于Rails为object-orientated,因此ActiveRecord associations的设置主要取决于系统中对象的关联。

many-to-many关联主要基于两个模型之间的共享对象;而one-to-many关联是具有大量依赖数据的模型的结果

为了做出决定,我只想看看你有什么。如果您想根据LinkedIn的喜欢预先填充技能,请转到has_many :through