0

初心者がRoR3で継承を実装するための最良の方法を選択するのを手伝ってください。私は持っています:

-個人(住所フィールド、生年月日など)
   -Player、Personから継承(position、shoe_sizeなど)
      -ゴールキーパー、プレーヤーから継承(この役割に関連する他の特定のフィールド)

作成されたテーブルには多くのnullフィールドがあるため、単一テーブル継承は悪い解決策だと思います。これを行うための最良の方法は何ですか?ポリモーフィックアソシエーションを使用しますか(has_one?)?Belongs_to / has_oneを使用します(ただし、PlayerビューにPersonのフィールドも表示する方法は?)?継承を実装しませんか?他の解決策?

4

2 に答える 2

1

STI はおそらくこれに使用するアプローチだと思いますが、多くの属性を避けたい場合は、Person モデルに属性を格納するNULL列を追加するという別の可能性があります。これを行うには、テーブル に列を追加します。other_attributesHashtextpeople

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です。

于 2012-04-12T12:29:18.483 に答える
0

私はSTIをお勧めします。別の解決策は、mongodb のようなドキュメント ストアを使用するか、アクティブ レコード ストアhttp://api.rubyonrails.org/classes/ActiveRecord/Store.htmlを使用することです。Postgress データベースがある場合は、彼の HStore コラムhttp://rubygems.org/gems/activerecord-postgres-hstoreを参照してください。

もう 1 つのオプションは、PostgreSQL テーブルの継承です。http://www.postgresql.org/docs/8.1/static/ddl-inherit.html

于 2012-04-13T13:19:03.767 に答える