Ruby on Rails有很多关系。

时间:2013-11-07 12:36:09

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

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

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

3 个答案:

答案 0 :(得分:1)

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

在你的情况下,一个简单的has_many即可。 看起来应该是这样的

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

的更多信息

答案 1 :(得分:0)

一个问题是在用户和Helprequests和技能之间建立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

进行搜索

答案 2 :(得分:0)

我害怕ShivamD的回答是不够的。这需要重复Skills,并查询相关的User.help_requests via关系,而您需要一个交集。

不仅如此,Users创建HelpRequests的用户已经拥有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