在Rails用户模型中设置default_address

时间:2010-12-08 18:38:25

标签: ruby-on-rails activerecord data-modeling

我目前正在研究User has_many :addresses的模型;这些地址构成一个小型地址簿,用户可以从中选择送货地址和邮寄地址。

我的问题是,对于我来说,将Address关系中的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

但我知道这很草率,因为我的默认地址和用户之间会有两条链接。

我应该在地址中设置默认布尔值,并使用scope获取默认值吗? (这增加了额外的验证,因为我不想要多个默认地址......嗯。)

我认为这在地址管理的应用程序中必须经常出现,所以我想出了我的想法,然后问一下。任何有关最佳实践的建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

我会在地址中添加'is_default'标志。然后,您需要在地址中进行验证,例如:

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

这将确保您只获得一个默认地址,但允许使用任意数量的非默认地址。

答案 1 :(得分: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

您的应用需要处理逻辑,以确保使用第二种安排只有一个默认地址。