2011-08-04 11 views
2

を二つの関連モデル(STI)との間に、ユーザーの選択肢を与える私のモデルです:Railsのモデリング - 同じ形式でここ

class BillingProfile < ActiveRecord::Base 
    belongs_to :student 
    attr_accessible :cost 
end 

class PerEventBillingProfile < BillingProfile 
    belongs_to :event_category 
end 

class FlatFeeBillingProfile < BillingProfile 
    attr_accessible :interval, :frequency 
end 

学生は、両方のタイプの多くの課金プロファイルを持つことができます。私が望むものは、学生がPerEventBillingProfileとFlatFeeBillingProfileの作成を選択できるラジオボタンです。イベントごとのラジオが選択されると、PerEventBillingProfileのフィールドが表示され、その逆もあります。このモデルの設定で起こるようにするには、私は次のようにしなければならないようです。

class Student < ActiveRecord::Base 
    has_many :per_event_billing_profiles 
    has_many :flat_fee_billing_profiles 
    accepts_nested_attributes_for :per_event_billing_profiles 
    accepts_nested_attributes_for :flat_fee_billing_profiles 
end 

これはもっと簡単な感じです。私が欲しいものを手に入れるより簡単な方法はありますか?私はこれをすべて1つのモデルに入れて、列にNULL値をたくさん入れてもいいと思っていますが、どちらも気に入らないのです。

答えて

0

これは私がこれをどのようにして得たかです。私はhas_many:billing_profiles行をStudentに保存しました。

<%= f.fields_for :billing_profiles do |builder| %> 
    <tr> 
    <%= render 'billing_profile_fields', :f => builder %> 
    <tr> 
<% end %> 

と部分で:フォームでは私はこれでした

<td> 
    <%= f.label :type, "Profile type" %> 
    <%= f.select :type, { "Per Event" => "PerEventBillingProfile", "Flat Fee" => "FlatFeeBillingProfile" } %> 
</td> 

をそして私はJSを使用して、現在選択された種類に無関係なフィールドを非表示にします。これは、すべてのバリデーションがBillingProfileに入っていなければならないことを意味しますが、これはSTIの目的を少し凌駕します。

関連する問題