Использование вложенных моделей «многие ко многим» в Rails - PullRequest
1 голос
/ 16 ноября 2009

У меня есть следующая настройка ситуации для моделирования Клиента с несколькими адресами и справочной таблицей для типа адреса. Модель данных Клиент - адрес: отношение «многие ко многим», представленное таблицей соединений под названием «Местоположение».
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")

1 Ответ

1 голос
/ 16 ноября 2009

Вы можете добавить несколько таблиц, которые будут объединены в запросе выбора.

def find_locationtype(type)
    find :all, :conditions => ['location_types.name = ?', type], :joins => :location, :locationtype
end

Когда вы делаете customer.find_locationtype('work'), сгенерированный запрос объединит таблицы location и locationtype. Таким образом, вы получите доступ к каждому полю из этих двух таблиц и сможете добавлять к ним условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...