假设您正在使用 ActiveRecord:当然可以让一个模型属于多个其他模型(但是您需要为每个关系指定一个 own_to 语句)。
class Appointment < ActiveRecord::Base
belongs_to :trainer
belongs_to :customer
end
属于关系并不一定意味着该记录实际上与其他记录相关;它也可以为零。因此,您可以进行属于培训师但不属于客户的预约,反之亦然。
实际上,您甚至可以既没有培训师也没有客户,或者既没有培训师也没有客户——如果这违反了您的业务逻辑,您可能需要添加验证来防止这种情况发生。
您现有的控制器创建方法应该继续像以前一样工作,您只需要添加对培训师记录的处理。您甚至可以使用同一控制器通过抽象培训师和客户来处理培训师和客户的任命,例如变成这样的人:
class AppointmentsController < ApplicationController
def create
@appointment = person.appointments.build(params[:appointment])
# ...
end
protected
def person
@person ||=
if params[:trainer_id]
Trainer.find(params[:trainer_id])
elsif params[:customer_id]
Customer.find(params[:customer_id])
end
end
end
这样,您就可以对两条路线使用相同的约会控制器
# Use AppointmentsController for /trainers/123/appointments
# as well as for /customers/123/appointments
map.resources :trainers, :has_many => :appointments
map.resources :customers, :has_many => :appointments
当然,只有当培训师预约和客户预约背后的逻辑和观点几乎相同时,这才有意义。如果没有,您也可以使用不同的控制器
# Use TrainerAppointmentsController for /trainers/123/appointments and
# CustomerAppointmentsController for /customers/123/appointments
map.resources :trainers do |trainer|
trainer.resources :appointments, :controller => 'trainer_appointments'
end
map.resources :customers do |customer|
customer.resources :appointments, :controller => 'customer_appointments'
end