2011-06-21 33 views
22

ユーザーがいて、さまざまなタイプのユーザーを作成したいと思う場合、電子メールとWebサイトのフィールドを持つサブスクライバのみの普通のユーザーと言うと、追加されたユーザーからすべてを継承する方法フィールド?Railsモデル継承

答えて

26

すべてのフィールドを含むテーブルを作成し、型の列を指定する必要があります。 すなわち

create_table :users do |t| 
    t.string :email 
    t.string :website 
    t.string :type 
end 

次に、あなたは、加入者がユーザーモデルからすべてを継承します

Class User < ActiveRecord::Base 

Class Subscriber < User 

のようなクラスを持つことができます。タイプコラムがあるので、異なるモデルと区別することができます。たとえば、「タイプ」の列を使用しなかった場合と同様に、ユーザーも検索されます。

+20

OP:これは「単一テーブル継承」または「STI」と呼ばれます。だから、もしあなたがそれを必要とするなら、それがどのように働くかについてのより多くの情報のためのGoogle。 – Pavling

+4

トピックでかなりのグーグル・グーグルを行った後、モデルによってデータが異なる場合に多態的な関連付けを使用するほうが好ましいと思われるものもあります。これにより、多数のヌルフィールドを持つ1つのテーブルを持つことが回避されます。 このrailscastが役に立ちました:http://railscasts.com/episodes/394-st-and-polymorphic-associations。 – rogerkk

+0

タイプ欄にはどのような実際の値がありますか? –

13

あなたはsingle table inheritanceがほしいと思う、Alex Reisnerのリンクで説明されている。 STIは単一の表を使用して、が基本モデルからを継承する複数のモデルを表します。 Railsの世界では、データベース・スキーマには行によって表されるモデルのタイプを指定する列があります。データベース移行でtypeという名前の列を追加すると、RailsはSTIを使用することを推論しますが、データモデルで名前を指定すると列は任意の名前になります(class method 'inheritance_column'を参照)。これにより、typeは予約語になります。

+2

これは壊れています。私は正しいリンクが[http://www.alexreisner.com/code/single-table-inheritance-in-rails](http://www.alexreisner.com/code/single-table-inheritance-in-rails)だと思います) –

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 – Luke

+1

@ルーク:「単一テーブルの継承」が答えである限り、それは正確にリンク専用ではありません。 –

関連する問題