4

这很容易,但是在框架/语言之间来回切换让我怀疑自己。has_many :through试图为Rails中的关系制定路线。

#User
has_many :reservations, :dependent => :destroy
has_many :events, :through => :reservations

#Reservation
belongs_to :user
belongs_to :event

#Event
has_many :reservations, :dependent => :destroy
has_many :attendees, through => :reservations, :source => :user

我想要从用户模型中快速构建/创建新预订到特定事件的路线(反之亦然),但不知道如何去创建它们。这看起来很奇怪:

resources :users do
  resources :reservations, only: [:new, :create, :destroy]
end

resources :events do
  resources :reservations, only: [:new, :create, :destroy]
end

无论如何,只是寻找验证,或者可能是另一种处理方式。理想情况下,用户可以单击的事件旁边的页面上有一个链接,并且(通过 ajax 或页面重新加载)他们会进行“预订”。

出于同样的原因,我需要路由来查看每个对给定事件有预订的用户。并且为给定用户保留的每个事件。

4

2 回答 2

7

好问题!我想我会选择这组路线:

resources :events do
  resources :reservations, only: [:new, :create, :destroy]
end

resources :users do
  get 'reservations', :on => :member
end

您的预订将与活动密切相关。我认为从建模的角度来看这是有道理的。根据您的描述,听起来登录用户会在活动中单击链接以创建预订。通过将预订与事件相关联,您只需从路线就知道要为哪个事件构建预订,并且因为您有一个经过身份验证的用户,您也可以假设要使用哪个用户(可能来自您的会话)。例如,类似 POST 的路由/events/5/reservations会为当前登录的用户创建事件 5 的预留。

对资源的附加get操作user允许您提供端点来回答问题What reservations does a particular user have?

理想情况下,您希望确保只有一组端点用于管理资源。就通过非资源操作获取附加信息而言,这更多是一个偏好问题以及您想要支持哪些用例。

于 2013-01-18T00:51:14.797 回答
1

我会用它来干燥路线:

def reserv
  resources :reservations, only: [:new, :create, :destroy]
end

resources :users do
  reserv
end

resources :events do
  reserv
end
于 2013-04-09T17:53:40.773 回答