4

RailsのSTIについて少し混乱しています。

私の状況:電話、ファックス、電子メールなどの連絡先を保存するための文字列フィールドContactを持つモデルがdescriptionあります。data

メールアドレスの電話番号などの特定の連絡先タイプがある場合、データ形式を別の方法で検証し、出力で別の形式を作成したいと思います。

すべてのモデルが同じデータを持ち、動作が異なるため、STIを使用することにしました。また、Railsの規則に反したくないので、フォームとCRUD操作に関していくつか質問があります。

  1. モデルタイプのフォームでドロップダウンリストを作成するにはどうすればよいですか?ハードコーディングする必要がありますか、それとももっと自動化された方法がありますか?

  2. レコードを作成するにはどうすればよいですか?ステートメントを使用switchし、受け取ったタイプに従って、対応するインスタンスの新しいモデルを作成する必要がありますか?

  3. モデルタイプを変更する場合、どのように更新すればよいですか?オブジェクトを新しいクラスにキャストしますか?または、新しいオブジェクトを作成して前のオブジェクトを破棄しますか?

私はあなたの助けにとても感謝します!

4

2 に答える 2

2
  1. はい、STIモデルのデフォルトストアがないため、ハードコアを行う必要があります。
  2. 一般的に、はい。しかし、Railsを使用camelize.constantizeすると、文字列からクラスを取得するために使用できます。もう1つの方法は、親モデルを使用し、typeフィールドを手動で設定することです。STIすべてのレコードが同じテーブルにあり、すべてが親クラスである場合と同様です。
  3. type更新する場合は、フィールドを更新するだけです。次に、再クエリを実行して、Railsに異なるタイプの新しいオブジェクトを取得させることができます。
于 2012-07-20T11:58:00.207 に答える
0

次のようなモデルを作成できます。

Type < ActiveRecord::Base
  has_many :contacts
end

このコマンドを使用して、連絡先に列をrails g model Type name:string追加しtype_id、データベースを移行できます。

連絡先のモデルを次のように変更します。

Contact < ActiveRecord::Base
  belongs_to :type
end

今、あなたのフォームで、あなたはこれを使うことができます:

select("type", "type_id", Type.all.collect {|t| [ t.name, t.id ] }, { :include_blank => true })

それはあなたの問題を解決するはずです。

今、あなたはこのようなことをすることができます:

@emails = Type.find_by_name('email').contacts

またはスコープを使用します。

于 2012-07-20T11:51:42.597 に答える