我想找出设计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的回答.虽然每个人都提出了很好的建议,但对我个人来说,他的建议是最有用的.我以前并没有真正意识到枚举的概念,自从研究它之后,我发现它解决了我在应用程序中遇到的许多问题.我鼓励每个发现这个问题的人阅读所有答案,这里有很多好的方法.

推荐答案

简单地说,您要问的是如何枚举ActiveRecord属性.关于在rails应用程序中使用enum,在web上甚至网上都有很多讨论,例如hereherehere等等.

我从来没有使用过Enum but 100 sounds particularly suited for your use case的许多Ruby 中的一个.它没有activerecord支持的属性集的缺点,因此属性值的维护非常简单.它甚至还提供了formtastic或simple form的表单助手(我想这可以帮助您在角色搜索中 Select 属性).

Ruby-on-rails相关问答推荐

RSpec系统测试无法从工厂访问新创建的记录

包含字母和数字组合的正则表达式

Ruby on Rails/Activerecord 排序自引用查询?

序列化来自关联的不可变数据是个好主意吗?

为什么 Rails 执行器不能识别内核的改进?

在 Rails 7 中,可以将导入映射与 js Bundle 解决方案一起使用,还是它们是专有的?

ruby on rails 和 javascript 之间的时间转换反之亦然?

rails s和bundle exec rails s有什么区别?

rails, activerecord, 获取当前连接规范

Rails 4,使用 ActiveRecord 的原始查询

从 ActiveRecord 模型的集合中构建哈希

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A

更改 form_for rails 3.1 生成的 html 表单 ID

使 rails 控制台输出更漂亮一点

在 RoR 中引用同一个表的多个外键

在 rails 3 中批量插入

ruby/ruby on rails 内存泄漏检测

为什么不对 Rspec + Selenium 使用共享的 ActiveRecord 连接?

按照给定 ID 数组的顺序按 ID 查找模型记录

ActionMailer 在开发 Rails 4 中不发送邮件