Моделирование рельсов - предоставьте пользователю выбор между двумя связанными моделями (sti) в одной форме - PullRequest
2 голосов
/ 04 августа 2011

Вот мои модели:

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

Такое ощущение, что это может быть проще. Есть ли более простой способ получить то, что я хочу? Я понимаю, что могу сложить все это в одну модель и просто добавить в столбцы несколько значений NULL, но мне это тоже не нравится.

1 Ответ

0 голосов
/ 12 августа 2011

Вот как я прошел через это. Я сохранил строку has_many: billing_profiles в Студенте. В форме я сделал это:

<%= 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.

...