Restfully destruir associação polimórfica no Rails?
-
19-09-2019 - |
Pergunta
Como faço para destruir a própria associação e deixar os objetos que estão sendo associados sozinho, mantendo esta RESTful?
Especificamente, eu tenho esses modelos:
class Event < ActiveRecord::Base
has_many :model_surveys, :as => :surveyable, :dependent => :destroy, :include => :survey
has_many :surveys, :through => :model_surveys
end
class ModelSurvey < ActiveRecord::Base
belongs_to :survey
belongs_to :surveyable, :polymorphic => true
end
class Survey < ActiveRecord::Base
has_many :model_surveys
end
Isso é dizer que o evento é :surveyable
(ModelSurvey belongs_to Event
). A minha pergunta é, sem ter que criar uma ModelSurveysController
, como faço para destruir o ModelSurvey
, deixando o Event
e Survey
sozinho?
Algo com map.resources :events, :has_many => :model_surveys
? Eu não estou muito certo o que fazer nesta situação. O que precisa acontecer com as rotas, e que precisa acontecer no controlador? Eu estou esperando que a url poderia ser algo como isto:
/events/:title/model_surveys/:id
Obrigado por sua ajuda, Lance
Solução
No Rails 2.3 você tem accepts_nested_attributes_for
que iria deixá-lo passar um array de ModelSurveys para o evento em questão. Se você permitir que destruir através da declaração atributos aninhados, você vai ser capaz de passar event[model_surveys][1][_destroy]=1
ea associação será removida. Confira o api docs .
Outras dicas
domínio Recursos! = Domínio modelo
O domínio do controlador não é a mesma que a dos modelos. É perfeitamente possível atualizar vários modelos, alterando o estado de um recurso.
No seu caso o que significa fazer um PUT ou POST, quer ao evento ou a Pesquisa que contém uma lista de ids para o outro. O modelo para um vai atualizar a associação.
PUT ou POST
Algumas pessoas (mas não Roy Fielding ) acreditam que você deve usar um PUT para atualizar o recurso e fornecer todo o estado de novo, outros acham que um POST com o estado parcial (ala PATCH) é suficiente.