Удаление только записи таблицы соединений в Ruby on Rails - PullRequest
1 голос
/ 26 июля 2011

У меня есть следующие простые модели:

class Event < ActiveRecord::Base
  has_many :participations
  has_many :users, :through => :participations
end

class Participation < ActiveRecord::Base
  belongs_to :event
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :participations
  has_many :events, :through => :participations
end

На мой взгляд, в зависимости от роли текущего пользователя я хочу удалить либо событие, либо запись об участии, либо только запись об участии.

У меня сейчас есть

<% = link_to 'Удалить событие', событие,: подтвердить => 'Вы уверены?', : метод =>: удалить%>

, который удаляет как событие, так и его участие. Мне нужно другое действие? или может захватить действие уничтожения события? Как бы это выглядело?

Спасибо

1 Ответ

2 голосов
/ 26 июля 2011

Что ж, хак может быть что-то вроде этого в помощнике вида:

def link_to_delete_event( event, participation = nil )
  final_path = participation.nil? ? event_path( event ) : event_path( :id => event, :participation_id => participation )
  link_to 'Delete event', final_path, :confirm => 'Are you sure?', :method => :delete
end

И, по вашему мнению, вы бы использовали link_to_delete_event (событие) , чтобы удалить только событиеи link_to_delete_event (событие, участие) , чтобы удалить участие.Ваш контроллер может выглядеть примерно так:

def destroy
  @event = Event.find(params[:id])
  unless params[:participation_id].blank?
    @event.destroy
  else
    @event.participations.find( params[:participation_id] ).destroy
  end
  redirect_to somewhere_path
end

РЕДАКТИРОВАТЬ

Чтобы сделать его менее хакерским, вы должны создать вложенный ресурс для участия в событиях:

map.resources :events do |events|
  events.resources :participations
end

И тогда вам нужно будет создать ParticipationsController , который может выглядеть следующим образом:

class ParticipationsController < ApplicationController
  before_filter :load_event

  def destroy
    @participation = @event.participations.find( params[:id] )
    @participation.destroy
    redirect_to( event_path( @event ) )
  end

  protected

  def load_event
    @event = Event.find( params[:event_id] )
  end
end

И помощник link_to изменится на это:

def link_to_delete_event( event, participation = nil )
  if participation
    link_to 'Remove participation', event_participation_path( event, participation ), :method => :delete
  else
    link_to 'Delete event', event_path( event ), :confirm => 'Are you sure?', :method => :delete
  end
end
...