Полиморфные ассоциации в Рельс 3 - PullRequest
6 голосов
/ 01 марта 2011

Я думаю, что схожу с ума.

Допустим, у меня есть 3 модели: Адрес, Склад, Категория:

class Address < ActiveRecord::Base
  belongs_to :category
  belongs_to :addressable, :polymorphic => true

  scope :billing_addresses , where(:categories => {:name => 'billing'}).joins(:category)  
  scope :shipping_addresses , where(:categories => {:name => 'shipping'}).joins(:category) 

end 


class Category < ActiveRecord::Base
  has_many :addresses
  has_many :subcategories, :class_name  => "Category", :foreign_key => "category_id"
  belongs_to :category, :class_name => "Category"  
end


class Warehouse < ActiveRecord::Base
  has_many :addresses, :as => :addressable
end

Адрес является полиморфным, поскольку в конечном итоге я буду использовать его для хранения адресов для клиентов, людей, сотрудников и т. Д. Также каждый адрес может быть определенного типа: выставление счетов, доставка, работа, дом и т. Д.

Я пытаюсь вытащить некоторую информацию на странице.

@some_warehouse = Warehouse.first

Тогда, на мой взгляд:

%b= @some_warehouse.name
%b= @some_warehouse.billing_address.address_line_1

Etc.

Я заканчиваю поиск по каждой строке информации.

Я пытался делать такие вещи, как

Warehouse.includes(:addresses).where(:name => "Ware1")
Warehouse.joins(:addresses).where(:name => "Ware1")

И различные варианты этого. Независимо от того, что я делаю, я не могу получить рельсы для предварительной загрузки всех столов. Что я делаю не так?

Ответы [ 2 ]

8 голосов
/ 01 марта 2011

Вот пересмотренные модели, которые делают соответствующие объединения в sql и уменьшают количество запросов с 16 до 8, по одному на каждую часть информации, вместо нескольких, которые также выполняют поиск категорий и т. Д.:

class Address < ActiveRecord::Base
  belongs_to :category
  belongs_to :addressable, :polymorphic => true

  scope :billing_addresses ,  where(:categories => {:name => 'billing'}).includes(:category)
  scope :shipping_addresses , where(:categories => {:name => 'shipping'}).includes(:category)

end

class Warehouse < ActiveRecord::Base
  has_many :addresses,  :as => :addressable,  :include => :category, :dependent => :destroy

  def billing_address
    self.addresses.billing_addresses.first
  end    
  def shipping_address
    self.addresses.shipping_addresses.first
  end   
end


class Category < ActiveRecord::Base
  has_many :addresses
  has_many :subcategories, :class_name  => "Category", :foreign_key => "category_id"
  belongs_to :category, :class_name => "Category"  
end

Сон помогает.Также не забывайте время от времени перезагружать консоль: -)

1 голос
/ 01 марта 2011

Может быть, вы хотите использовать preload_associations ?

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