2009-08-21 11 views
0

私は、Addresses,ListsおよびAddressListMembershipsを持っています。多対多接続を削除する適切な方法は何ですか?

この特定のアプリケーションでは、Listが1000を超え、Addresseが何千もあります。

ユーザーがListAddressを制御できるようにするためのUIページを実装しました。これらのアクションを追加しました...

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 

答えて

2

いいえではありません。アドレス一覧のメンバシップが添付されているオブジェクトには、使用できるメソッドがあります。したがって、あなたのアドレスモデルにアクセスすることができます:

@address.list_ids 

これは、結合のIDの配列です。あなたが持っている場合:

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

3つの結合レコードがあります。あなたはIDが2の一覧を取り除くしたい場合は、そのチェックボックスがこれまで偉大なインタフェースです

@address.list_ids = [1,3] 

、あなたがこのrailscastをチェックアウトする必要があり、HMTの関係とHABTM関係は外の_idsアレイ方法を提供するだろうActiveRecordのボックス。

これが最適な方法です。

+0

あなたは私が扱っているものとは異なる状況を想定しています。はい、多くの場合、チェックボックスは優れた解決策です。私は自分の質問をより明確にしようとします。 – Ethan

関連する問題