Ниже я обрисовал структуру полиморфной ассоциации.
В VacationsController я добавил несколько комментариев, описывающих мою текущую проблему. Тем не менее, я хотел опубликовать это, чтобы увидеть, если мой подход здесь немного не так. В business_vacations_controller и staff_vacations_controller вы можете видеть, что мне пришлось сделать «геттеры» для модели и контроллера, чтобы я мог получить к ним доступ из vacations_model, чтобы я знал, с каким типом объекта я имею дело. Хотя это работает, это начинает казаться немного сомнительным.
Есть ли лучшая «лучшая практика» для того, чего я пытаюсь достичь?
модель
vacation.rb
class Vacation < ActiveRecord::Base
belongs_to :vacationable, :polymorphic => true
end
business.rb
class Business < ActiveRecord::Base
has_many :vacations, :as => :vacationable
end
staff.rb
class Staff < ActiveRecord::Base
has_many :vacations, :as => :vacationable
end
business_vacation.rb
class BusinessVacation < Vacation
end
staff_vacation.rb
class StaffVacation < Vacation
end
Контроллеры
business_vacations_controller.rb
class BusinessVacationsController < VacationsController
private
def controller_str
"business_schedules"
end
def my_model
BusinessVacation
end
def my_model_str
"business_vacation"
end
end
staff_vacations_controller.rb
class StaffVacationsController < VacationsController
private
def controller_str
"staff_schedules"
end
def my_model
StaffVacation
end
def my_model_str
"staff_vacation"
end
end
vacations_controller.rb
class VacationsController < ApplicationController
def create
# Build the vacation object with either an instance of BusinessVacation or StaffVacation
vacation = @class.new(params[my_model_str])
# Now here's the current issue -- I want to save the object on the association. So if it's a 'BusinessVacation' object I want to save something like:
business = Business.find(vacation.vacationable_id)
business.vacations.build
business.save
# But if it's a 'StaffVacation' object I want to save something like:
staff = Staff.find(vacation.vacationable_id)
staff.vacations.build
staff.save
# I could do an 'if' statement, but I don't really like that idea. Is there a better way?
respond_to do |format|
format.html { redirect_to :controller => controller_str, :action => "index", :id => vacation.vacationable_id }
end
end
private
def select_class
@class = Kernel.const_get(params[:class])
end
end