如何使用has_and_belongs_to_many关联销毁连接表中的记录?

时间:2016-10-25 14:45:03

标签: ruby-on-rails destroy jointable favorite

我正在创建一个用户可以收藏房间的应用。我完成了这个 has_and_belongs_to_many关联。我选择了这个而不是has_many:因为这需要第三个模型(可能是收藏夹)并且它只会用于创建关联。

如何在视图或控制器中添加不受欢迎(破坏)的操作?

rooms_controller.rb

def favorite
    room = Room.find(params[:id])
    current_user.rooms << room unless current_user.rooms.exists?(room)
    redirect_to wishlist_path
end

的routes.rb

post 'rooms/:id/favorite' => 'rooms#favorite'

show.html.erb(会议室)

<div>Add to Wishlist</div>
<%= form_tag(controller: "rooms", action: "favorite", method: "post") do %>
    <%= submit_tag "Favorite"%>
<% end %>

wishlist.hmtl.erb

<% current_user.rooms.each do |room| %>
    <%= room.listing_name %>
<% end %>

2 个答案:

答案 0 :(得分:1)

我相信这应该有效。假设您有空间不为用户设置并将房间保存为@room。然后你可以简单地做current_user.rooms.delete(@room),我相信rails会做其余的事情。这适用于has_many但我目前无法使用has_and_belongs_to_many关联进行测试,值得一试!

Documentation

答案 1 :(得分:1)

  

我选择了这个而不是has_many:通过因为这需要一个   第三个模型(可能是收藏),它只会用于   创建协会。

我实际上会采用相反的方式,然后选择has_many through。然后,要从收藏夹中删除一个房间,您可以通过以下方式destroy进行关联:

...
FavoriteRoom.find_by(
  user_id: current_user.id,
  room_id: params[:room_id]
).destroy
...