4

ここに私のモデルがあります:

class Lesson < ActiveRecord::Base
  belongs_to :topic, :polymorphic => true  
  validates_presence_of :topic_type, :topic_id  
end

class Subject < ActiveRecord::Base  
   has_many :lessons, :as => :topic  
end

class Category < ActiveRecord::Base  
  has_many :lessons, :as => :topic  
end

ここで必要なのは、ユーザーがレッスンを作成または更新できるフォームです。問題は、サブジェクトとカテゴリが混在する選択メニューを提供するにはどうすればよいかということです。(ユーザーにとって、この特定のフォームでは件名とカテゴリは交換可能ですが、他の場所ではそうではありません。)

理想的には、これは次のようになります。

ビュー/レッスン/_form.html.haml

= simple_form_for(@lesson) do |f|
  = f.input :title
  = f.association :topic, :collection => (@subjects + @categories)

topic_id のみを指定し、topic_types も必要であるため、これは機能しません。しかし、どうすればこれらの値を指定できるのでしょうか?

問題の核心は、2 つの異なる属性 (topic_id と topic_type) に対応する 2 つの値を指定する単一の選択メニューが本当に欲しいということだと思います。これを行うためのエレガントなレールのような方法はありますか?

いくつかのメモ:

a) 単一のテーブルの継承により、この問題は解消されますが、カテゴリとサブジェクトには独自の関係があるため、これは避けたいと思います。詳細は割愛します。

b) JavaScript の悪ふざけができるかもしれませんね。しかし、それは面倒に聞こえます。それを行うためのよりクリーンな方法、魔法のフォームヘルパーなどがある場合、それは確かに望ましいです.

c) 私は simple_form を使用していますが、問題が複雑になる場合に備えて、それに固執していません。

ありがとう

4

2 に答える 2

-1

STI を使用したくない場合は、同様のことを行うことができます。つまり、 orTopic(name:string)をポリモーフィックに参照する新しいモデルを作成します。SubjectCategory

class Lesson < ActiveRecord::Base
  belongs_to :topic
  validates_presence_of :topic_id  
end

class Topic < ActiveRecord::Base
  belongs_to :topicable, :polymorphic => true
end

class Subject < ActiveRecord::Base
   has_one :topic, :as => :topicable
   has_many :lessons, :through => :topic
   accepts_nested_attributes_for :topic
end

class Category < ActiveRecord::Base  
   has_one :topic, :as => :topicable
   has_many :lessons, :through => :topic
   accepts_nested_attributes_for :topic
end

新しいサブジェクト/カテゴリを作成するビューで:

<%= form_for @subject do |subject_form| %>
  <%= subject_form.fields_for :topic do |topic_fields| %>
    <%= topic_fields.text_field :name %>
  <% end %>
<% end %>
于 2011-07-11T16:31:07.440 に答える