在哪里放置嵌套资源删除多对多关系

时间:2014-01-27 18:29:05

标签: ruby-on-rails controller resources nested

我有使用嵌套资源的Rails 4应用程序,而子(会话)也与另一个模型(发言者)有多对多的关系。

 resources :parent do
   resources :child
 end

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to  :parent
  has_and_belongs_to_many :speakers
end

class Speaker < ActiveRecord::Base
  has_and_belongs_to_many :children
end

我试图找出哪个控制器应该具有删除/添加关系(发言者)。我可以在SessionController#destroy中处理这个问题但是必须处理这种关系的特殊情况(感觉不对)。目前我有一个自定义路由到SessionController#speaker传递一个操作参数(:add,:delete)。

我保留关系双方的记录,只删除关系

sessions.speakers.delete(speaker)

您认为最佳方法是什么?

  • 将SessionController中的删除关系保持在特殊路由
  • 以特殊路线添加到SpeakerController
  • 创建一个新控制器来处理关系

1 个答案:

答案 0 :(得分:0)

<强> ActiveRecord的

要从集合中添加或删除对象,您需要<< and .delete ActiveRecord方法

这些工作使用ActiveRecord对象,可以像这样调用:

#apps/controller/posts_controller.rb
def comment
    post = Post.find(params[:post_id])
    comment = Comment.find(params[:comment_id])

    #Add
    post.comments << comment

    #Delete
    post.comments.delete(comment)
end

<强>控制器

在回答您关于哪个控制器的问题时,我建议将代码保存在“父”控制器中(在您的情况下为sessions)&amp;创建一个处理流程的方法

这是我们上周创建的实时代码:

#config/routes.rb
resources :entries do
   match ":category_id", to: :category, via: [:post, :delete], as: "category"
end

#app/controllers/entries_controller.rb 
def category
    entry = Entry.find(params[:entry_id])
    category = Category.find(params[:category_id])

    #Actions
    entry.categories << category if request.post?
    entry.categories.delete(category) if request.delete?

    #Return
    redirect_to collection_path
end

这允许我们调用具有不同:method的单个链接来调用不同的操作:

<%= link_to "Add Category", admin_entry_category_path("60", "20"), method: :post %>