STI はおそらくこれに使用するアプローチだと思いますが、多くの属性を避けたい場合は、Person モデルに属性を格納するNULL
列を追加するという別の可能性があります。これを行うには、テーブル
に列を追加します。other_attributes
Hash
text
people
def self.up
add_column :people, :other_attributes, :text
end
次に、属性がモデルでシリアル化されていることを確認します。Hash
また、使用時に必ず空として初期化されるようにラッパーを作成することもできます。
class Person < ActiveRecord::Base
serialize :other_attributes
...
def other_attributes
write_attribute(:other_attributes, {}) unless read_attribute(:other_attributes)
read_attribute(:other_attributes)
end
end
次に、次のように属性を使用できます。
p = Person.new(...)
p.other_attributes #=> {}
pl = Player.new(...)
pl.other_attributes["position"] = "forward"
pl.other_attributes #=> {"position" => "forward"}
このアプローチの 1 つの注意点は、 からデータを取得するときに文字列をキーとして使用する必要があることです。これは、 がデータベースから取得さother_attributes
れるとき、キーは常に文字列になるためHash
です。