在rails中为has_many关系指定默认记录的最佳方法

Sha*_*moe 6 ruby-on-rails has-one has-and-belongs-to-many belongs-to

我有帐户和帐户地址.一个帐户可以有多个AccountAddressess,我想指定一个作为"default_account_address",因此在Account表中,我有一个名为"default_account_address_id"的列.这是模型的当前状态.

class Account < ActiveRecord::Base
  has_many :account_addresses
  belongs_to :default_account_address,
             :class_name => "AccountAddress",
             :inverse_of => :account_assigned_to_as_default
end

class AccountAddress < ActiveRecord::Base
  belongs_to :accounts
  has_one :account_assigned_to_as_default, 
          :class_name  => "Account", 
          :foreign_key => :default_account_address_id, 
          :inverse_of  => :default_account_address
end
Run Code Online (Sandbox Code Playgroud)

除了@ account.default_account_address返回帐户地址和@ account.account_addresses返回空数组这一事实外,这种方法很好.

因此,问题是默认帐户地址不包含在@ account.account_addresses中.

有关解决此问题的最佳方法的任何想法?我考虑过habtm,但这似乎不合适.我考虑使用has_one:default_account_address,但这没有意义,因为default_account_address_id列在帐户表上.谢谢.

bre*_*ish 5

可能有更好的方法,但我想到了以下几点:

class Account < ActiveRecord::Base
  has_many :account_addresses

  def default_address
    account_addresses.find_by_default true
  end
end

class AccountAddress < ActiveRecord::Base
  belongs_to :accounts
end
Run Code Online (Sandbox Code Playgroud)

这当然假设您在 AccountAddress 中有一个名为 default 的布尔列。我可能会向 AccountAddress 添加验证,以检查是否只有 1 个 AccountAddress 标记为给定 account_id 的默认值。您还可以在 AccountAddress 中创建一个方法,不仅将地址标记为默认地址,而且还为您取消标记所有关联的地址。

就像我说的,那里可能有更好的东西,但这应该允许默认地址也显示在@account.account_addresses 中。


Mar*_*ske 0

我不知道这是否是最佳实践,但是,我只需向表中添加一个属性“mainaddress”,并在关系中仅使用 has_many/belongs_to 。在帐户模型中,我将放置一个函数,该函数使用一个简单的查询来获取主地址,其中 mainaddress 为 true。