0

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

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

4

3 回答 3

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

有关更多信息,请参阅文档

于 2013-11-07T13:02:07.060 回答
0

一个干草是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

于 2013-11-07T13:01:02.633 回答
0

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

不仅如此,Users创造HelpRequests者已经有了has_many关系。那讲得通。

我将不包括我将HABTM要建议的架构(请参阅此处),但我将介绍模型。基本上你想要的:

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

编辑:这是 schmea 的HABTM

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
于 2013-11-07T14:07:19.910 回答