1

更新:これについてもう少し考えた後、この質問にはポリモーフィズムとSTIの両方が含まれていると思います。

私が次のものを持っているとしましょう:

class Vehicle < ActiveRecord::Base
  belongs_to :dealership
  ...
end

class Car < Vehicle
  ...
end

class Truck < Vehicle
  ...
end

Car モデルと Truck モデルの属性は同じですが、モデル内のロジックが異なるため、すべて Vehicles テーブルを使用するだけです。

誰かが新しい車両レコードを作成し、それが「車」か「トラック」かを選択できる汎用フォームを作成したいと考えています。バックエンドでは、このフォームは一般的な「車両」レコードではなく、「車」または「トラック」レコードを作成する必要があります。

質問: Rails フォームでこのオプションをどのように表示しますか? 具体的には、抽象基本モデルの子型をリストする方法はありますか、および/またはこれらを (たとえば) フォームの Select 要素として提示する簡単な方法はありますか?

車とトラックの 2 つの異なるフォームを作成するのではなく、車またはトラックを作成できるフォームを作成しようとしている理由は、最終的には、これらのモデルを親である "Dealership" にネストしたいからです。新しい車両を作成し、オプションとして「車」または「トラック」を選択できるだけでなく、ユーザーが「ディーラー」をロードしてすべての車を表示/編集できるネストされたフォームを使用できるようにしたいと考えていますそして、その販売店に所属するトラックを 1 つの形にまとめます。accepts_nested_attributes_forのような単純な関連付けを使用して設定する方法は知っていますがVehicle belongs_to :dealership、Vehicle から継承する子モデルに設定する方法がわかりません。

4

3 に答える 3

1

私は同じ問題を抱えていました。基本的に、基本クラスの関連付けを受け入れるフォームを作成しようとしてhas_manyいますが、装飾/コンクリート クラスのいずれかに対して動的に個別のフォームを作成 (ネストされたフィールドを追加) したいと考えています。

cocoonこれは、フォームに正しいフィールドを動的に追加するメソッドを提供する gemを使用して解決しました。パーシャルは次の_formようになります。

# _form.html.haml

= simple_form_for @dealership, :html => { :multipart => true } do |f|

  = f.simple_fields_for :vehicles do |vehicle|
    = render 'vehicle_fields', :f => vehicle
    = link_to_add_association 'Add a Car', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Car.new }
    = link_to_add_association 'Add a Truck', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Truck.new }

= f.button :submit, :disable_with => 'Please wait ...', :class => "btn btn-primary", :value => 'Save'

そして、_vehicle_fields

# _vehicle_fields.html.haml

- if f.object.type == 'Car'
  = render 'car_fields', :f => f
- elsif f.object.type == 'Truck'
  = render 'truck_fields', :f => f

car_fieldsまた、truck_fields_link_to_remove_associationcocoon

https://github.com/nathanvda/cocoon:wrap_objectドキュメントを参照するか、http://www.powpark.com/blog/programming/2014/05/07/rails_nested_forms_for_single_table_inheritance_associations で私のブログ投稿を読んでください。

于 2014-05-07T21:27:38.473 に答える
0

フォーム上の単純なselect要素が問題の解決策ではないと思います。ここで達成しようとしていることはと呼ばMultiple Table Inheritanceれ、データベースに簡単に反映されるようにモデルを構造化する方法が問題になるはずです。長い議論なので、これを行うための最適な方法を説明するこの記事を紹介します。私はある意味であなたを助けたことを願っています:)

PS:あなたの質問に答えるために、Railsフレームワークでそのようなことを行う組み込みのメカニズムはありません。

于 2012-07-22T20:25:02.293 に答える
0

私は間違っているかもしれませんが、逆に理解polymorphicしています。つまり、モデルは他の複数のモデルに属することができます...

CarTruckの一種ですVehicle。それで、それVehicleyearmark属性を持っているとしましょう。

新しいCarorを作成できTruck、ポリモーフィックが定義されているので、通常どおりフォームを作成します。

@car = Car.find(id)
@vehicle = @car.vehicles.build(year: "1999", mark: "Beetle") 
@vehicle.save

それが役立つことを願っています...

于 2012-07-22T20:12:59.977 に答える