0

ユーザーテーブルと、新しく作成した教師があります。教師はユーザーのサブクラスであるため、足場ジェネレーターを使用して教師テーブルを生成し、モデルを変更して、教師がユーザーのサブクラスになるようにします。その後、db:migrate を実行しました。それから、私はに行きます

http://localhost:3000/teachers/new

エラーが表示されます:

undefined method `teacherSalary' for #<Teacher:0x103331900>

それで、私の質問は私が何を間違えたのですか?ユーザー登録を行うためのページを作成したいのですが、ユーザーは教師/生徒にしかなれません。でも、先生の記録を追加することはできません... ...さらに、私はに行きます

http://localhost:3000/users/new

ユーザーが自分のユーザーを「教師」または「学生」に登録できるようにするコンボボックスが必要です。しかし、私が期待したようにすべてがうまくいかないようです。私は何をする必要がありますか?大変お世話になりました。

4

3 に答える 3

2

データベース内には、users という単一のテーブルが必要です。このテーブルには、デフォルトでタイプと呼ばれる文字列列が必要です。この列に別の名前を使用する場合は、次を使用して継承列名を手動で設定する必要がありますself.inheritance_column = "column_name"

アプリケーション内には、User、Student、および Teacher という 3 つのモデルがあります。User は通常どおり ActiveRecord::Base から継承し、Student と Teacher はどちらも User から継承します。

その後、新しい Teacher および Student オブジェクトをインスタンス化できるようになります。内部的には、モデル名をユーザー テーブルのタイプ フィールドに書き込むことStudent.findで機能し、それを使用するときに SQL に句を追加して、タイプ = 'Student' の行のみを返します。

検証などの共有動作を User クラスに追加してから、継承されたクラスに追加の動作を追加できます。

STI の動作の詳細については、Martin Fowlers Book(Patterns of Enterprise Application Architecture) を参照してください。

于 2010-07-10T09:04:29.770 に答える
2

この定義は非常に便利であることがわかりました。STI は、1 つのテーブルに複数のモデルのデータが含まれていることを意味し、通常は「タイプ」列によって区別されます。("users" テーブルには、"Teacher"、""Pupil"、"Employee"、"Assistant" などのモデルのデータが含まれています。) 新しいモデルを作成する代わりに、同じテーブルに類似のモデルを保持します。

ポリモーフィックな関連付けとは、1 つのモデルを他の複数のモデルに関連付けることができることを意味します(コメントは投稿、画像、ファイル、user_type に属することができます...)。外部キーの競合を防ぐために、関連付けは *_id および *_type 列で再現されます。 *_id だけではなく。

于 2010-12-21T15:39:14.920 に答える
0

あなたがここに持っているものについては、性感染症が最良の方法であるかどうかはわかりません. STI は一般に、オブジェクト指向のような継承があり、モデルの属性が同じで動作が異なる場合に使用する必要があります。あなたの場合、 Teacher と Student は確かにいくつかの共有された属性を持つことができますが、それらは異なるものを持つことにもバインドされています。
ポリモーフィックな関連付けも試してみてください。

于 2010-07-10T11:56:23.140 に答える