【问题标题】:A Ruby on Rails has_many relationship.Ruby on Rails has_many 关系。
【发布时间】:2013-11-07 12:36:09
【问题描述】:

我是 RoR 的新手,正在做我的第一个项目。该想法背后的基本概念是将选择了一组“技能”的“用户”与提交了专门处理这些所选技能的“帮助请求”的其他用户联系起来。如果您愿意,可以将熟练用户与需要帮助的用户联系起来的应用程序。我的问题与用户、技能和 Help_Request 模型之间的关系有关。感觉就像“has_many:通过关联”或“多态关联”可能是为了这种三向关系?真的不确定吗?

任何想法或建议将不胜感激。

【问题讨论】:

  • 最简单的结构是用户/技能和帮助请求/技能之间的 HABTM,然后您就可以加入。

标签: ruby-on-rails ruby database ruby-on-rails-3 model


【解决方案1】:

多态关联是指一个模型应该属于另一个模型。假设您是评论模型。您可以对帖子和评论本身发表评论。那时你会使用多态。

在你的情况下,一个简单的 has_many through 就可以了。 它应该是这样的

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

class Skill < ActiveRecord::Base 
  belongs_to :user
  belongs_to :helpRequest
end

class HelpRequest < ActiveRecord::Base 
  has_many :skills 
  has_many :users, through :skills
end

更多信息请联系docs

【讨论】:

    【解决方案2】:

    恐怕 ShivamD 的回答还不够。这将需要重复的Skills,并通过关系查询相关的User.help_requests,而您需要一个交集。

    不仅如此,创建HelpRequestsUsers 已经拥有has_many 关系。这是有道理的。

    我不会包含我即将建议的HABTM 的架构(请参阅here),但我会介绍模型。基本上是你想要的:

    skill = Skill.create(name: "My Skill")
    user.skills         << skill
    help_request.skills << skill
    
    user.matched_help_requests
    #> [help_request]
    

    可以如下实现:

    class User
      has_and_belongs_to_many :skills
    
      def matched_help_requests
        HelpRequest.joins(:skills).where("skills.id IN(?)", skills.pluck(:id))
      end
    end
    
    class HelpRequest
      has_and_belongs_to_many :skills
    end
    
    class Skill
      has_and_belongs_to_many :users
      has_and_belongs_to_many :help_requests
    end
    

    编辑:这是HABTM 的 schmea:

    rails g migration add_skills_join_tables
    

    在迁移中

    def change
      create_table :skills_users, id: false do |t|
        t.references :skill
        t.references :user
      end
    
      create_table :help_requests_skills, id: false do |t|
        t.references :skill
        t.references :help_request
      end
    
      add_index :skills_users,        [:skill_id, :user_id]
      add_index :help_request_skills, [:skill_id, :help_request_id] 
    end
    

    【讨论】:

    • 只是为了澄清。当我设置我的 HABTM 关系时,我是否会创建一个或两个没有主键的连接表? (如文档中所示)另外,您介意再解释一下“matched_help_request”方法吗?非常感谢 Damien,我非常感谢。
    • @Flint285 您需要两个连接表。请参阅 tiagotex 的答案。您需要的两个表是skills_usershelp_requests_skills,它们都没有主键,但它们确实有索引。我将更新我的答案以显示迁移。
    • @Flint285 更新了答案。 matched_help_request 方法可能会得到改进。这样做是通过连接表 Skills_users (skills.pluck(:id)) 收集用户的技能 ID,然后在 HelpRequest 技能 ID 匹配的地方执行连接查询。
    • 好的,我的方案和模型都准备好了。您介意再解释一下“Skill.create”方法以及它如何适合控制器和视图吗?像往常一样,非常感谢 Damien。
    【解决方案3】:

    一个干草是在用户和帮助请求和技能之间创建has_and_belongs_to_many关系,所以你最终会得到这个:

    class User < ActiveRecord::Base
      has_and_belongs_to_many :skills
    end
    
    class Help_request < ActiveRecord::Base
      has_and_belongs_to_many :skills
    end
    
    class Skills < ActiveRecord::Base
          has_and_belongs_to_many :users
          has_and_belongs_to_many :help_requests
    end
    

    然后你需要创建表

     rails g migration add_skills_users_table
    
     rails g migration add_help_requests_skills_table
    

    最后运行rake db:migrate

    然后您可以使用User.first.skills 搜索它

    【讨论】:

    • 只是为了澄清。当我设置我的 HABTM 关系时,我是否会创建一个或两个没有主键的连接表?
    猜你喜欢
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多