【问题标题】:Several Rails many to many relationships几个 Rails 多对多关系
【发布时间】:2016-06-23 19:00:23
【问题描述】:

我正在创建一个具有多个多对多关系的应用。这是一个例子:一个应用程序用户将拥有多种技能。同时,很多job_posts都会有几个技能。我希望能够重用技能模型,这样我就可以拥有这样的东西:

    User----has_many----->Skill(smart)<---has_many----job_posting
                              ^
                              |
                           has_many
                              |
                          Application

所以你看,我希望基本上能够创建一个技能(在这个例子中:“智能”),然后使用 has_many 关系从几个不同的模型中引用该技能。

最好的方法是什么?我想避免创建一堆额外的模型来处理关系,因为我的应用中有几个这样的设置。

最后,能够做这样的事情会很好: myUser.skills.add(Skill.find(1)) myCompany.skills.add(Skill.find(1))...

附: 我知道没有技能.add() 这样的东西。如果您有建设性的内容,请建议我可以使用什么。谢谢:)

P.P.S 我使用 mysql 作为我的数据库

【问题讨论】:

  • 您需要设置一个数据库表来保存关系信息。研究使用has_many :through
  • 嗯,这就是我希望避免的:/,特别是因为我必须为每个这样的设置为每个关系类型制作一个
  • 你认为它还能怎么做?您可以采取低效的路线,并通过到处添加外键来避免关系表。

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


【解决方案1】:

我认为这是一个典型的多态关联示例。您可以查看2.9节的相关文档here。在您的情况下,您可以使用

class Skill < ActiveRecord::Base
  belongs_to :skillable, polymorphic: true
end

class User < ActiveRecord::Base
  has_many :skills, as: :skillable
end

class JobPosting< ActiveRecord::Base
  has_many :skills, as: :skillable
end

【讨论】:

  • 太棒了!我想我应该能够使用它,只需向 Skill 添加一个方法,以允许我从对象中创建散列,这样我就可以执行类似 user.skills.create(Skill.find(1).hashify()) 的操作
  • 你可以像这个 user.skills 给你的模型添加一个技能
  • 太棒了!我认为这让我只能通过 1 个真正的多对多关系来解决问题!你是真正的救星!顺便说一句,你知道这在后台做什么吗? db 是如何跟踪这个的?
  • 您可以在我引用的文档中看到这一点。还提供了表格结构。
猜你喜欢
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多