2009-08-21 5 views
0

J'ai Addresses, Lists, et AddressListMemberships.Quelle est la bonne façon de supprimer une connexion many-to-many?

Dans cette application particulière, il y a plus de mille List s et plusieurs milliers de Addresse s.

J'ai mis en place une page d'interface utilisateur pour permettre aux utilisateurs de contrôler un ListAddress es. J'ai ajouté ces actions ...

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 

Tout fonctionne à merveille.

Cependant, ces actions semblent contenir trop de code. Je suppose qu'il ya une plus succincte, Railsish façon de les mettre en œuvre, en particulier cette chose ...

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

Répondre

2

Non, ce n'est pas. L'objet auquel votre appartenance à la liste d'adresses est associée contient une méthode que vous pouvez utiliser. Ainsi, sur votre modèle d'adresse, vous pouvez accéder à:

@address.list_ids 

Ceci est un tableau d'ID pour la jointure. Donc si vous avez:

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

il y aura trois enregistrements joints. Si vous voulez vous débarrasser de la liste avec ID2 vous le feriez

@address.list_ids = [1,3] 

Les cases à cocher sont une grande interface, vous devriez vérifier cette railscast, la relation HMT et les relations HABTM fournissent les méthodes de tableau de _ids sur la boîte dans ActiveRecord.

C'est la meilleure façon de le faire.

+0

Vous envisagez une situation différente de celle à laquelle j'ai affaire. Oui, les cases à cocher sont une excellente solution dans de nombreux cas. Je vais essayer de clarifier ma question. – Ethan

Questions connexes