Рассматривали ли вы Наследование в одной таблице ?Я думаю, что это лучшее решение для вас.
По сути, вы определяете таблицу и модель часов, которая выглядит точно так же, как часы персонала или рабочие часы, и содержит строковый столбец с именем type.Затем вы создаете подклассы часов, чтобы определить методы и проверки, относящиеся к рабочим и служебным часам соответственно.Вы также можете захотеть переопределить вашу ассоциацию на что-то более общее.В этом примере я назвал его хранителем, как и тот, кто хранит эти часы.
В двух словах: все функции полиморфизма для вас обрабатываются.
Модели:
class Hour < ActiveRecord::Base
# common associations/methods etc go here
end
class BusinessHour < Hour
belongs_to :keeper, :class_name => "Business"
#business hour specific logic
end
class StaffHour < Hour
belongs_to :keeper, :class_name => "Staff"
#staff hour specific logic
end
class Business < ActiveRecord::Base
has_many :business_hours, :foreign_key => :keeper_id
...
end
class Staff < ActiveRecord::Base
has_many :staff_hours, :foreign_key => :keeper_id
...
end
Маршрут:
map.resources :business_hours, :controller => "hours", :class => "BusinessHour"
map.resources :staff_hours, :controller => "hours", :class => "StaffHour"
Контроллер:
class HoursController < ApplicationController
before_filter :select_class
def select_class
@class = Kernel.const_get(params[:class])
end
def new
@hour = @class.new
...
end
def show
@hour = @class.find(params[:id])
...
end
...
end
Представления будут выглядеть почти точно так же, как сейчас, но вы захотите, чтобы некоторые помощники сохранили выводпрямо.
module HourHelper
def keeper_type
@class == "BusinessHours" ? "Business" : "Staff"
end
end
-form_for(obj) do |f|
=f.error_messages
%p =select keeper_type, :mon_start_time, hours
to
=select keeper_type, :mon_stop_time, hours
=link_to 'Back', obj_path
Возможно, вы захотите создать собственный конструктор форм, чтобы упростить создание форм.