我是 RoR 的新手,正在做我的第一个项目。这个想法背后的基本概念是将选择了一组“技能”的“用户”与提交了专门处理这些选择的技能的“帮助请求”的其他用户联系起来。如果您愿意,可以将熟练用户与需要帮助的用户联系起来的应用程序。我的问题与用户、技能和 Help_Request 模型之间的关系有关。感觉就像“has_many:通过关联”或“多态关联”可能是为了这种三向关系?真的不确定吗?
任何想法或建议将不胜感激。
我是 RoR 的新手,正在做我的第一个项目。这个想法背后的基本概念是将选择了一组“技能”的“用户”与提交了专门处理这些选择的技能的“帮助请求”的其他用户联系起来。如果您愿意,可以将熟练用户与需要帮助的用户联系起来的应用程序。我的问题与用户、技能和 Help_Request 模型之间的关系有关。感觉就像“has_many:通过关联”或“多态关联”可能是为了这种三向关系?真的不确定吗?
任何想法或建议将不胜感激。
多态关联是指一个模型应该属于另一个模型。假设您是评论模型。您可以对帖子和评论本身发表评论。那时你会使用多态。
在你的情况下,一个简单的 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
有关更多信息,请参阅文档
一个干草是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
恐怕 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