我想找出设计rails模型的最佳方法.在本例中,假设我正在构建一个字符数据库,它可能有几个不同的固定属性.例如:
Character
- Morality (may be "Good" or "Evil")
- Genre (may be "Action", "Suspense", or "Western")
- Hair Color (may be "Blond", "Brown", or "Black")
... 等等
因此,对于角色模型,有几个属性,我希望基本上有一个固定的可能 Select 列表.
我希望用户能够创建一个角色,并以我希望他们从每个可用选项中 Select 一个的形式.我还希望能够让用户使用这些属性进行搜索...(也就是说,"给我看那些‘好’的、来自‘悬念’类型的、有‘棕色’头发的角色).
我可以想出几种方法来做到这一点...
1: Create a string for each attribute and validate limited input.
在本例中,我将在字符表上定义一个字符串列"道德",然后使用其中指定的选项创建一个类常量,然后根据该类常量进行验证.
找到好的角色就要Character.where(:morality=>'Good')
个.
这很好,也很简单,缺点是如果我想给属性添加更多细节,比如有一个"善"和"恶"的描述,以及一个用户可以查看给定道德的所有字符的页面.
2: Create a model for each attribute
在本例中,Character belongs_to Morality
将是一个Morality
模型和一个moralities
表,其中包含两条记录:Morality id:1, name:Good
等.
找到好的角色就好像Morality.find_by_name('Good').characters
个...或
这可以很好地工作,但这意味着您有几个表,这些表的存在只是为了保存少量预定义的属性.
3: Create a STI model for attributes
在这种情况下,我可以做与#2相同的事情,除了创建一个通用的"CharacterAttributes"表,然后将其子类化为"道德属性"和"GenreAttribute"等.这使得许多属性只有一个表,否则它看起来与idea#2差不多.
所以,这是我能想到的解决这个问题的三种方法.
My question is, how would you implement this, and why?
你会使用上述方法中的一种吗?如果会,是哪一种?你会做些不同的事吗?我特别想听听您将采取的方法的性能考虑.我知道这是一个广泛的问题,谢谢你的任何意见.
EDIT:
我真的为我的应用程序这方面的设计感到苦恼,现在是时候实现它了.提前感谢大家的讨论!!
FINAL NOTE:
谢谢你们所有人的深思熟虑和有趣的回答,他们都很好,对我很有帮助.最后(就在赏金到期之前!)我真的很感激Blackbird07的回答.虽然每个人都提出了很好的建议,但对我个人来说,他的建议是最有用的.我以前并没有真正意识到枚举的概念,自从研究它之后,我发现它解决了我在应用程序中遇到的许多问题.我鼓励每个发现这个问题的人阅读所有答案,这里有很多好的方法.