我无法轻松地找到相关主题,所以在这里我们去 - 一个经典问题:我有一个用户或人模型,我想(< 8小时,〜8小时,> 8小时),吸烟,日常暴晒等,以模拟该人的身体特性/属性(眼睛颜色,头发颜色,肤色,性别,某些生活习惯属性,如睡眠时间,夜间暴露等等)模型人(用户)配置文件属性/属性 - 最佳实践,静态与动态属性
我通常通过为每个属性创建单独的导轨模型(数据库表)来解决该问题,因为之后很容易在稍后添加更多选项,编辑它们,将其用作<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
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模型分成两个归一化的。或者,也许你建议别的?
当然,我的错误。我已将has_one更改为belongs_to。 – januszm 2013-04-08 14:21:57
你也可以考虑像你所建议的动态属性。不过,如果你这样做,我会考虑为你的'property_types'和''property_values'添加一个模型。所以不仅仅是一个'PersonProperty'表。最重要的收获是您将能够动态创建属性,而无需编写任何代码。 – 2013-04-08 14:24:30
您能否提供一些简单的代码示例,让我们来说说这两个表将如何与人员表和一些示例记录相关?我担心这种方法在性能方面可能效率不高,但我会对如何实现它感兴趣。 – januszm 2013-04-08 16:50:14