0

次のドメイン クラスがあります。

class Rating < ActiveRecord::Base
  validates :kind_id, presence: true # Kind of rating (Class, Type, ...)
end

レーティングは、パイロットが操縦できる航空機のクラスまたはタイプを指定します。パイロットにクラス レーティングがある場合、どのクラスかを知る必要があるため、ID を STI テーブルに保存します。

class KlassRating < Rating
  validates :klass_id, presence: true
end

パイロットにタイプ レーティングがある場合、どのタイプかを知る必要があるため、ID を STI テーブルに保存します。

class TypeRating < Rating
  validates :type_id, presence: true
end

これに関する問題は、フォームでユーザーからの入力を取得する方法です。私が今持っているフォームRatingは、ユーザーがドロップダウンでクラスまたはタイプの評価を選択したかどうかに関係なく、常に をインスタンス化します。したがって、私の検証は決して評価されません。

Rails で適切な派生クラスをインスタンス化するにはどうすればよいですか?

4

1 に答える 1

2

まず、状態が異なる場合(KlassRatingの場合はklass_id、TypeRatingの場合はtype_id)、実際にはSTIはありません。パイロットクラスのレーティング用のテーブルとパイロットタイプのレーティング用の別のテーブルが必要です。多態的な外部キーを使用して特定の評価タイプを参照する一般的な評価クラスがある場合があります。ポリモーフィックをbelongs_toドキュメントで検索します。

STIの場合、「評価」テーブルに「type」という名前のフィールドがあることは言及していません。これが必要なのは、KlassRatingまたはTypeRatingオブジェクトのインスタンス化を保存する場合、それを取得するときに、目的のrubyクラスのオブジェクトによって保存されるようにするためです。

于 2012-04-29T13:34:13.520 に答える