Как правильно удалить связь «многие ко многим»? - PullRequest
0 голосов
/ 21 августа 2009

У меня есть Addresses, Lists и AddressListMemberships.

В этом конкретном приложении более тысячи List с и многие тысячи Addresse с.

Я реализовал страницу пользовательского интерфейса, чтобы пользователи могли контролировать List Address es. Я добавил эти действия ...

class ListsController < ApplicationController

  # ...

  def add_address
    @list = List.find(params[:id])
    address = Address.find(params[:address_id])
    @list.addresses << address unless @list.addresses.include? address
    redirect_to(manage_list_addresses_path(@list))
  end

  def remove_address
    @list = List.find(params[:id])
    address = Address.find(params[:address_id])
    @list.addresses.delete address
    redirect_to(manage_list_addresses_path(@list))
  end

end

Все прекрасно работает.

Однако эти действия выглядят так, будто в них слишком много кода. Я предполагаю, что есть более лаконичный, Railsish способ их реализации, особенно эта штука ...

@list.addresses << address unless @list.addresses.include? address

1 Ответ

2 голосов
/ 21 августа 2009

Нет, это не так. У объекта, к которому присоединено ваше членство в списке адресов, есть метод, который вы можете использовать. Таким образом, на вашей модели адреса вы можете получить доступ:

@address.list_ids

Это массив идентификаторов для объединения. Так что если у вас есть:

@address.list_ids = [1,2,3]

будет три объединенных записи. Если вы хотите избавиться от List с идентификатором 2, вы бы сделали это

@address.list_ids = [1,3]

Флажки являются отличным интерфейсом для этого, вы должны проверить это railscast , отношения HMT и HABTM предоставляют методы массива _ids из коробки в ActiveRecord.

Это лучший способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...