【问题标题】:Database organization for separating two different types of the same model用于分离同一模型的两种不同类型的数据库组织
【发布时间】:2015-02-25 23:32:23
【问题描述】:

所以我希望我的用户模型拥有_many 技能。我希望技能有两个不同的类别:想要的技能和拥有的技能。

例如,用户可以将技能添加到他们拥有的个人资料中,例如 HTML。他们还可以在他们的个人资料中添加他们希望学习的技能,例如 Ruby on Rails。在他们的个人资料中,它将分别列出他们当前的技能和想要的技能。

从高层次上看,构建这个的最佳方法是什么?我只希望有 1 个没有重复项的技能模型,但我希望有一种方法让用户在数据库中拥有 2 个单独的技能组。

【问题讨论】:

    标签: ruby-on-rails relationships database-relations


    【解决方案1】:

    可以使用单表继承

    class Skill < ActiveRecord::Base
    end
    
    class WantedSkill < Skill
       belongs_to :user
    end
    
    class PossessesSkill < Skill
      belongs_to :user
    end
    

    您的技能表应该有一个名为 type 的列,其中将存储技能的类型。

    WantedSkill.create(:name => "html")
    

    上面会将记录保存在技能表中,类型为“WantedSkill”。您可以通过

    WantedSkill.where(:name => "html").first
    

    你的用户关联可以像

    class User < ActiveRecord::Base
       has_many :wanted_skills
       has_many :possessed_skills
    end
    

    您可以阅读文档here

    【讨论】:

      【解决方案2】:

      实现这一点的方法是,您需要两个 skill 字段,例如:wanted_skillpossessed_skill

      因此,在 Ruby on Rails 中,您可以对同一模型有多个引用(具有不同名称),您只需在引用中使用 class_name 声明对应的类,例如:

      class User < ActiveRecord::Base
        belongs_to :wanted_skill, class_name: 'Skill'
        belongs_to :possessed_skill, class_name: 'Skill'
      end
      

      【讨论】:

      • 我不想做 has_many :wanted_skill, class_name: 'Skill' 而不是 belongs_to?
      • 是的,但是belongs_to 对您的代码更有意义,使用此技能只能将一个技能关联到每个字段,如果您想要多个,则需要一个many-to-many relationship
      猜你喜欢
      • 2020-01-08
      • 1970-01-01
      • 2021-07-03
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多