以下是该场景:我正在构建一个允许用户根据他们的技能集互相搜索的系统。
我有4个表:用户,技能,类别&技能组
假设John Doe(用户名:“johndoe”)具有以下类别和技能组合:
类别:前端 技能:HAML,SASS / SCSS,CoffeeScript,Javascript,jQuery
类别:后端 技能:Ruby,Ruby on Rails,node.js
我希望能够执行以下操作:
user = User.where(:username => "johndoe").first
user.categories
# returns a list of the user's categories
user.skills
# returns a list of the user's skills
user.category.where(name => "Front-End").first.skills
# => returns list of skills in the "Front-End" category
user.skills.where(:name => "HAML").first.category
# returns "Front-End" category
# adds a skill without assigning it to a category
user.skills << skill_object
user.skills.last.level = 9
user.skills.last.interest = 6
user.skills.last.save
# adds a skill while assigning it to a category
user.category.skills << skill_object
user.category.skills.last.level = 9
user.category.skills.last.interest = 6
user.category.skills.last.save
为了按技能找到用户:
skill = Skill.where(:name => "Javascript").first
skill.users
# returns users possessing skill
我一直在玩我的模特一段时间,但并没有像我希望的那样表现得很好。我需要一个全新的视角 - 任何指针/建议?
答案 0 :(得分:0)
我对Ruby一无所知,但从关系数据库的角度来看,我可能只为每个用户创建一个特殊的,硬编码的类别字段:Uncategorized
。
然后,当您添加技能时,他们要么进入指定的类别,要么为该用户默认未分类。除了每个用户的一个“特殊”记录之外,无论您正在查看哪种技能或类别,其他所有内容都将完美运行,您可以将所有约束保留在原位,而无需担心空值。
UserID, User
1, me
CategoryID, UserID, Category
1,1,Uncategorized
2,1,Web GUI
SkillID, Skill
1,Javascript
2,Knitting
SkillID, CategoryID, Level, Interest
1,2,10,75
2,1,50,1
根据您使用Level和Interest的方式,我还考虑将它们设置为查找表,以便从数据库角度为值赋予意义(并帮助填充下拉列表)。 等