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