我目前正在研究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
获取默认值吗? (这增加了额外的验证,因为我不想要多个默认地址......嗯。)
我认为这在地址管理的应用程序中必须经常出现,所以我想出了我的想法,然后问一下。任何有关最佳实践的建议都将受到高度赞赏。
答案 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
您的应用需要处理逻辑,以确保使用第二种安排只有一个默认地址。