Модель и подход к проектированию контроллеров для полиморфной ассоциации - PullRequest
0 голосов
/ 21 октября 2010

Ниже я обрисовал структуру полиморфной ассоциации.

В 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

1 Ответ

0 голосов
/ 22 октября 2010

Такое ощущение, что в VacationsController приходится прыгать через много обручей, чтобы он знал контекст. Есть ли причина, по которой у StaffVacationsController и BusinessVacationsController не может быть действия #create, и представления будут отправляться в зависимости от того, что подходит? Эти действия уже будут знать контекст модели и смогут перенаправить на соответствующий URL позже.

...