【问题标题】:How to define the relationship between these 3 models?如何定义这3个模型之间的关系?
【发布时间】:2015-09-03 06:03:29
【问题描述】:

我有 3 个这样的模型-

| User       | Skill       | SubSkills    |
|:-----------|------------:|:------------:|
| Name       |Title        |     Title    |  
| Trade      |Trade        |    Done(bool)|    

模型应该是什么样子-

class User < ActiveRecord::Base
  has_and_belongs_to_many :skills
end

class Skill < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_many :sub_skills
end

class SubSkills < ActiveRecord::Base
  belongs_to :user #not sure
  belongs_to :skill
end

基本上,同一行业的每个用户的技能都是相同的,一个用户拥有多种技能。每项技能都有许多子技能,但为特定用户完成(或不完成)一项子技能。

这可能吗?有什么更好的方式来设计这种关系?如何为此定义路线?比如哪个资源会嵌套在哪个资源下?

【问题讨论】:

    标签: ruby-on-rails model relationship has-and-belongs-to-many


    【解决方案1】:

    我认为你很接近,但试试这个:

    class SubSkills < ActiveRecord::Base
      belongs_to :skill
      has_one :user, through: :skill
    end
    

    路线可以通过多种方式完成:不嵌套、嵌套、浅嵌套......等。 (查看Rails Routing from the Outside In,尤其是2.7.1 Limits to Nesting 部分)。这实际上取决于您的应用程序的需求。

    你可以这样做:

    /users/:id/skills/:skill_id/sub_skills/:sub_skill_id

    ..因此,在您的 routes.rb 中,您将拥有:

    resources :users do
      resources :skills do
        resources :sub_skills
      end
    end
    

    如果您希望能够像user.sub_skills 这样直接从用户访问所有sub_skills,而不是通过像user.skills.last.sub_skills 这样的特定技能,您必须将关联添加到User 模型,如下所示:

    class User < ActiveRecord::Base
      has_and_belongs_to_many :skills
      has_many :sub_skills, through: :skills
    end
    

    【讨论】:

    • 我需要输入User belongs_to :sub_skill 吗?我是否需要在 subskills 表中为 user_id 放置一个外键?
    • 不,不。除非你想能够做到user.sub_skills
    • 如果我在用户中嵌套技能,那么当我创建一个新技能时,我会有类似new_skill_path(@user) 的东西,那么这不会为那个特定的用户创建该技能吗?而我希望该技能属于每个从事相同行业的用户。但是,如果我将技能嵌套在用户之外,那么如何将特定用户的子技能标记为完成?(因为子技能嵌套在技能中)
    • 是这样的话,你可能想看看浅层嵌套。资源嵌套仅影响访问资源的路由和 URL/路径。它不控制模型关系。但是,它们通常以某种方式对齐。所以,真的,你可以两者兼得。将技能和 sub_skills 嵌套在该用户的关系下,但也可全局用于所有技能/sub_skills。从外向内阅读 Rails 路由。
    • 是的,我使用的是浅层嵌套,但即使在浅层嵌套中,当您在嵌套资源中创建新项目时,您也需要指定父项。如何避免指定父级?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2013-10-20
    • 2021-08-29
    • 2019-10-06
    相关资源
    最近更新 更多