SO に関する関連トピックを簡単に見つけることができなかったので、ここに行きます - 古典的な問題: User または Person モデルがあり、その人の物理的特性/属性 (目の色、髪の色、肌の色、性別、 1 晩の睡眠時間 (8 時間未満、~8 時間、8 時間以上)、喫煙、毎日の日光浴などのライフスタイル特性。
私は通常、プロパティごとに個別の 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 個のレコードを持つ のような小さなテーブルがたくさん残っています。これらの各テーブルには、意味のある列 (値) が 1 つだけあります。
おそらく単一のモデル、つまり次の構造を持つ 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 モデルを 2 つに分割することによって、より正規化される可能性があります。それとも、何か他のことを提案しますか?