REST полностью уничтожить полиморфную ассоциацию в Rails?

Как мне уничтожить саму ассоциацию и оставить связанные объекты в покое, сохраняя при этом RESTful?

В частности, у меня есть эти модели:

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

Это говорит о том, что событие :surveyable (ModelSurvey belongs_to Event). Мой вопрос: без необходимости создавать ModelSurveysController, как мне уничтожить ModelSurvey, оставив Event и Survey в покое?

Что-то с map.resources :events, :has_many => :model_surveys? Я не совсем уверен, что делать в этой ситуации. Что должно произойти с маршрутами и что должно произойти в контроллере? Я надеюсь, что URL-адрес может выглядеть примерно так:

/events/:title/model_surveys/:id

Спасибо за помощь, Ланс


person Lance Pollard    schedule 10.02.2010    source источник


Ответы (2)


В Rails 2.3 у вас есть accepts_nested_attributes_for, который позволит вам передать массив ModelSurveys рассматриваемому событию. Если вы разрешите уничтожение через объявление вложенных атрибутов, вы сможете передать event[model_surveys][1][_destroy]=1, и ассоциация будет удалена. Ознакомьтесь с документацией по API.

person Sam Coles    schedule 10.02.2010

Домен ресурсов != домен модели


Домен контроллера не совпадает с доменом моделей. Совершенно нормально обновлять несколько моделей, изменяя состояние ресурса.

В вашем случае это означает выполнение PUT или POST либо для события, либо для опроса, который содержит список идентификаторов для другого. Модель для одного обновит ассоциацию.

PUT или POST

Некоторые люди (но не Рой Филдинг) считают, что вы должны используйте PUT для обновления ресурса и повторного предоставления всего состояния, другие считают, что POST с частичным состоянием (например, PATCH) является достаточным.

person Chris McCauley    schedule 10.02.2010