У меня есть следующая настройка ситуации для моделирования Клиента с несколькими адресами и справочной таблицей для типа адреса. Модель данных
Клиент - адрес: отношение «многие ко многим», представленное таблицей соединений под названием «Местоположение».
LocationType - Location: один ко многим, так что тип локации (например, «работа», «дом») может иметь много ассоциаций с локацией.
То, чего я пытаюсь достичь, - это возможность просто найти все «рабочие» адреса для клиента или «адреса доставки». Избегая дублирования текста в объединительной таблице. Местоположение
Модель (ы) выглядят как:
class Address < ActiveRecord::Base
has_many :locations
has_many :customers, :through => :locations
end
class Customer < ActiveRecord::Base
has_many :locations
has_many :addresses, :through => :locations do
def special_location(loc)
find :all, :conditions => ['addr_type == ?', loc]
end
end
end
class Location < ActiveRecord::Base
belongs_to :address
belongs_to :customer
belongs_to :locationtype
end
class LocationType < ActiveRecord::Base
has_many :locations
end
Это работает нормально для простых случаев:
@customer = Customer.find(1)
@customer.addresses # return all addresses
И с помощью «специального вспомогательного метода» special_location («string») я могу добиться результата. Я хотел выяснить, как я могу добиться того же, используя дополнительную справочную таблицу (LocationType)
Что-то вроде
@customer.addresses.find_locationtype("work")