我无法轻易找到关于 SO 的相关主题,所以我们开始了 - 一个经典问题:我有一个用户或个人模型,我想为那个人的物理属性/属性(眼睛颜色、头发颜色、肤色、性别、一些生活方式属性,例如每晚的睡眠时间(<8h、~8h、>8h)、吸烟、每天晒太阳等。
我通常通过为每个属性创建一个单独的 rails 模型(数据库表)来解决这个问题,因为以后很容易添加更多选项,编辑它们,用作源<select>
,即
class Person
belongs_to :eye_color
belongs_to :skin_color
belongs_to :hair_color
belongs_to :sleep_per_night
belongs_to :sun_exposure
attr_accessible :gender # boolean, m/f
end
class HairColor
has_many :people
attr_accessible :value
end
class EyeColor
has_many :people
attr_accessible :value
end
Person.last.eye_color
...
EyeColor.first.people
但是,如果有很多这些属性(即 10-15 种不同的物理和生活方式属性)怎么办。对我来说,这似乎打破了 DRY 规则,也就是说,我留下了许多小表,比如eye_colors
3-5 条记录。这些表中的每一个只有一个有意义的列 - 值。
我在想你们如何解决这些问题,也许是通过创建一个模型,即具有以下结构的 PersonProperty
person_properties[type, value]
因此先前具有单独模型的解决方案,即 eye_color 和 hair_color 看起来像这样(类型/类和值):
# PersonProperty/person_properties:
1. type: 'HairColor', value: 'red'
2. type: 'HairColor', value: 'blond'
3. type: 'SkinColor', value: 'white'
4. type: 'EyeColor', value: 'green'
5. type: 'HairColor', value: 'black'
6. type: 'SkinColor', value: 'yellow'
7. type: 'SleepPerNight', value: 'less than 8h'
8. type: 'SleepPerNight', value: 'more than 8h'
9. type: 'DailySunExposure', value: 'more than 1h'
...
19. type: 'EyeColor', value: 'blue'
...
通过将 PersonProperty 模型一分为二,上述示例可能会更加规范化。或者,也许你建议别的东西?