Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails用户模型中设置默认_地址_Ruby On Rails_Activerecord_Data Modeling - Fatal编程技术网

Ruby on rails 在Rails用户模型中设置默认_地址

Ruby on rails 在Rails用户模型中设置默认_地址,ruby-on-rails,activerecord,data-modeling,Ruby On Rails,Activerecord,Data Modeling,我目前正在为一个用户开发一个模型,有很多地址;这些地址形成了一个小的地址簿,用户可以从中选择送货地址和邮寄地址 我的问题是,对于我来说,将中的地址对象标记为默认地址的最佳方式是什么 一种方法(我想我是对的)是维持这种关系: class User < ActiveRecord::Base has_many :addresses, :dependent => :destroy has_one :default_address, :class_name => "Address

我目前正在为一个
用户
开发一个模型,
有很多地址
;这些地址形成了一个小的地址簿,用户可以从中选择送货地址和邮寄地址

我的问题是,对于我来说,将
中的
地址
对象标记为默认地址的最佳方式是什么

一种方法(我想我是对的)是维持这种关系:

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
class用户:销毁
有一个默认地址:class\u name=>“地址”
类地址
但我知道这很草率,因为我的默认地址和用户之间有两个链接

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


我想这在地址管理的应用程序中一定会经常出现,所以我想我应该提出我的想法,然后提问。任何关于最佳实践的建议都将不胜感激。

如果是我,我会说外键属于用户,地址上有一个布尔方法来确定它是否是默认地址(假设你在应用程序中需要):


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

我会在地址中添加一个“is_default”标志。然后,您需要在地址中进行如下验证:

validates_uniqueness_of :is_default, :scope => :user_id, :unless => Proc.new { |address| address.is_default == 0 }
这将确保您只获得一个默认地址,但将允许任意多个非默认地址

class User
  has_many :addresses
  def default_address
    addresses.select(&:default_address?) #overly simple implementation
  end
end
validates_uniqueness_of :is_default, :scope => :user_id, :unless => Proc.new { |address| address.is_default == 0 }