Лучший способ указать запись по умолчанию для отношения has_many в rails - PullRequest
6 голосов
/ 06 апреля 2011

У меня есть учетные записи и учетные записи. У учетной записи может быть много 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 ]

4 голосов
/ 07 апреля 2011

Возможно, есть лучший способ, но вот что пришло на ум:

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

Это, конечно, предполагает, что у вас есть логический столбец с именем default в AccountAddress.Я бы, вероятно, добавил проверку AccountAddress, которая проверила бы, что для данного account_id указан только 1 AccountAddress по умолчанию.Вы также можете создать метод в AccountAddress, который не только помечает адрес по умолчанию, но и снимает пометку со всех связанных адресов для вас.

Как я уже говорил, вероятно, есть что-то лучшее, но это должно позволить использование по умолчаниюадрес, который также должен отображаться в @ account.account_addresses.

0 голосов
/ 09 июня 2019

Другое решение:

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
0 голосов
/ 21 ноября 2013

Другая идея состоит в том, чтобы использовать https://github.com/swanandp/acts_as_list, а затем рассматривать адрес по умолчанию как верхний, а затем установить какой-либо адрес по умолчанию так же просто, как:

address.move_to_top if params[:set_as_default]

Особенно, если все, что вам нужно, это показать его первым в каком-либо списке или поле со списком. Запросить адрес по умолчанию также легко, так как он всегда первый в области видимости.

0 голосов
/ 06 апреля 2011

Я не знаю, является ли это наилучшей практикой, однако я просто добавил бы в таблицу атрибут "mainaddress" и использовал бы только has_many / own_to в отношениях. В модель учетной записи я бы поместил функцию, которая выбирает основной адрес, используя простой запрос, где mainaddress равен true.

...