我有使用嵌套资源的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)
您认为最佳方法是什么?
答案 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 %>