【问题标题】:Setting default_address in Rails User model在 Rails 用户模型中设置 default_address
【发布时间】:2011-05-22 10:00:21
【问题描述】:

我目前正在为Userhas_many :addresses 制作模型;这些地址构成一个小型通讯簿,用户可以从中选择送货地址和邮寄地址。

我的问题是,将has_many 关系中的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

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

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

我认为这在具有地址管理的应用程序中必须经常出现,所以我想我会提出我的想法并提出问题。任何关于最佳实践的建议将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果是我,我会说外键属于用户,并在地址上使用布尔方法来确定其是否为默认地址(假设您的应用中需要该地址):

      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
      

      另一种可能的途径是给地址一个布尔标志以表明它是一个默认地址,并使用用户模型中的访问器来访问它:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多