7

我有帐户和帐户地址。一个帐户可以有多个 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

除了 @account.default_account_address 返回一个帐户地址和 @account.account_addresses 返回一个空数组之外,这很好用。

所以,问题是@account.account_addresses 中不包含默认帐户地址。

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

4

5 回答 5

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

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

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

于 2011-04-06T20:17:37.823 回答
3

另一种解决方案:

class Account < ActiveRecord::Base
  has_many :account_addresses
  has_one :default_account_address, -> { find_by_default true },
          class_name: 'AccountAddress'
end

class AccountAddress < ActiveRecord::Base
  belongs_to :accounts
end
于 2019-06-09T18:53:04.280 回答
0

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

于 2011-04-06T18:55:12.213 回答
0

另一个想法是使用https://github.com/swanandp/acts_as_list,然后将默认地址作为最上面的地址,然后,将某些地址设置为默认地址将非常简单:

address.move_to_top if params[:set_as_default]

特别是如果您只需要在某个列表或组合框中首先显示它。查询默认地址也很容易,因为它总是在“位置”范围内。

于 2013-11-21T18:11:58.507 回答
0

这个 gem set_as_primary以不同的方式解决了同样的问题。

于 2020-08-05T12:21:27.867 回答