gpt4 book ai didi

ruby-on-rails - 模型 "belong_to"可以有两个其他模型并具有嵌套关系吗?

转载 作者:行者123 更新时间:2023-12-04 01:38:57 25 4
gpt4 key购买 nike

一个模型是否有可能属于,两个模型并具有嵌套关系?

即我想要的

class trainer
has_many :appointments
end

class appointment
belong_to :trainer, :customer
end

class customer
has_many :appointments
end

目前我只有嵌套的客户和约会模型,例如我拥有的:

create 方法如下所示:
  def create
@appointment = @customer.appointments.build(params[:appointment])

respond_to do |format|
if @appointment.save
format.html { redirect_to([@customer, @appointment], :notice => 'Appointment was successfully created.') }
format.xml { render :xml => @appointment, :status => :created, :location => @appointment }
else
format.html { render :action => "new" }
format.xml { render :xml => @appointment.errors, :status => :unprocessable_entity }
end
end
end

在 route 我有:
  map.resources :patients, :has_many => [ :appointments, :visits ]

1 个模型可以有 2 个嵌套关系吗?如果预约也属于培训师和客户,我必须将我的创建方法更改为什么?

谢谢

最佳答案

假设您正在使用 ActiveRecord:当然可以让一个模型属于多个其他模型(但是您需要为每个关系指定一个belongs_to 语句)。

class Appointment < ActiveRecord::Base
belongs_to :trainer
belongs_to :customer
end

一个belongs_to 关系并不一定意味着该记录实际上与其他记录相关;它也可以为零。因此,您可以有属于培训师但没有客户的约会,反之亦然。

实际上,您甚至可以既没有培训师也没有客户,也可以同时拥有培训师和客户——如果这违反了您的业务逻辑,您可能需要添加验证来防止这种情况发生。

您现有的 Controller create 方法应该继续正常工作,您只需要添加训练器记录的处理。您甚至可以通过抽象培训师和客户来使用相同的 Controller 来处理培训师和客户的任命,例如变成这样的人:
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

这样,您可以为两条路线使用相同的 AppointmentsController
# 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

当然,这只有在培训师预约和客户预约背后的逻辑和观点几乎相同时才有意义。如果没有,您也可以使用不同的 Controller
# 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

关于ruby-on-rails - 模型 "belong_to"可以有两个其他模型并具有嵌套关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3401504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com