2010-12-08 2 views
2

私は現在Userというモデルのためにhas_many :addressesというモデルを作成しています。これらのアドレスは、ユーザが出荷および郵送先住所を選択できる小さなアドレス帳を形成する。Railsでdefault_addressを設定するユーザモデル

私の質問は、のオブジェクトの1つにhas_manyという関係のタグをデフォルトのアドレスとしてタグ付けする最良の方法は何ですか? (私はこの権利を持っていると思います)、この関係を維持するだろう

一つの方法:

class User < ActiveRecord::Base 
    has_many :addresses, :dependent => :destroy 
    has_one :default_address, :class_name => "Address" 

class Address < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :user, :foreign_key :default_address_id 

が、私は私のデフォルトのアドレスと私のユーザーの間で2つのリンクがありますように、そのは、ずさんなことを知っています。

アドレスにデフォルトのブール値を設定し、デフォルト値をscopeで設定する必要がありますか? (これは、複数のデフォルトアドレスを必要としないので、追加の検証を追加します)。

これはアドレス管理のあるアプリケーションではかなり頻繁に発生するはずなので、ただ聞いてください。ベストプラクティスに関する推奨事項は非常に高く評価されます。

答えて

2

私はAddressesに 'is_default'フラグを追加します。これは、あなたが唯一のデフォルトのアドレスを取得するようになりますが、あなたが望む限り多くの非デフォルトのアドレスを可能にする

validates_uniqueness_of :is_default, :scope => :user_id, :unless => Proc.new { |address| address.is_default == 0 } 

:次に、あなたのようなものがあるアドレスでの検証が必要になります。

+0

マイク、これはすばらしいです、ありがとうございます。 –

1

私の場合は、外来キーがUserに属していて、そのアドレスにデフォルトのアドレスがあるかどうかを判断するブール値のメソッドがあります(

)。
class User < ActiveRecord::Base 
    has_many :addresses, :dependent => :destroy 
    belongs_to :default_address, :class_name => "Address" 
end 

class Address < ActiveRecord::Base 
    belongs_to :user 
    def default_address? 
    user.default_address == self 
    end 
end 

別の潜在的な道は、アドレスにそのデフォルト・アドレスとは、それを取得するためにUserモデルにアクセサを使用することを示すブール値のフラグを与えることです:

class User 
    has_many :addresses 
    def default_address 
    addresses.select(&:default_address?) #overly simple implementation 
    end 
end 

アプリが処理する必要があります。第2のアレンジを使用してデフォルトアドレスが1つしかないことを保証するロジックement。

関連する問題