Установка default_address в модели Rails User - PullRequest
2 голосов
/ 08 декабря 2010

В настоящее время я работаю над моделью для User, которая has_many :addresses;Эти адреса образуют небольшую адресную книгу, из которой пользователь может выбирать адреса доставки и почтовые адреса.

Мой вопрос: как лучше всего пометить один из объектов Address в отношениях has_manyв качестве адреса по умолчанию?

Один из способов (я думаю, что я правильно понял) будет поддерживать эти отношения:

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?(Это добавляет дополнительную проверку, так как я не хочу нескольких адресов по умолчанию ... хм.)

Я полагаю, что это должно происходить довольно часто в приложениях с управлением адресами, поэтому решил, что я выложу свойидеи и просто спросить.Будем весьма благодарны за любые рекомендации по наилучшей практике.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Я бы добавил флаг is_default к адресам. Тогда вам понадобится проверка в Адресе, которая выглядит примерно так:

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

Это гарантирует, что вы получите только один адрес по умолчанию, но при этом разрешите столько адресов, которые вам не нужны.

1 голос
/ 08 декабря 2010

Если бы это был я, я бы сказал, что внешний ключ принадлежит пользователю с логическим методом для адреса, чтобы выяснить, является ли он адресом по умолчанию (при условии, что он понадобится в вашем приложении):

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

Другой потенциальный путь - присвоить адресу логический флаг, указывающий, что это адрес по умолчанию, и использовать для доступа к нему модель доступа в модели User:

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

Вашему приложению потребуетсяобрабатывать логику, чтобы гарантировать, что есть только один адрес по умолчанию, использующий второе расположение.

...