2010-09-20 2 views
4

Как вы хотите загрузить полиморфные ассоциации has_many :through в Rails/ActiveRecord?Eager Load Polymorphic has_many: через ассоциации в ActiveRecord?

Вот базовая установка:

class Post < ActiveRecord::Base 
    has_many :categorizations, :as => :categorizable 
    has_many :categories, :through => :categorizations 
end 

class Category < ActiveRecord::Base 
    has_many :categorizations, :as => :category 
    has_many :categorizables, :through => :categorizations 
end 

class Categorization < ActiveRecord::Base 
    belongs_to :category, :polymorphic => true 
    belongs_to :categorizable, :polymorphic => true 
end 

Предполагая, что мы хотим, чтобы решить эту проблему нетерпеливой загрузок для Rails 2.3.x и двойных полиморфных ассоциаций на модели присоединиться, как вы нетерпеливая нагрузка, :through ассоциации на что-то например:

posts = Post.all(:include => {:categories => :categorizations}) 
post.categories # no SQL call because they were eager loaded 

Это не работает, любые идеи?

ответ

0

Это проще сделать с has_many: through. У вас есть конкретная причина для желания использовать полиморфные ассоциации?

С has_many: через вы можете использовать этот запрос ActiveRecord

posts = Post.all(:include => [:categorizations, :categories]) 
posts[0].categories  # no additional sql query 
posts[0].categorizations # no additional sql query 

Модель Определения

class Post < ActiveRecord::Base 
    has_many :categorizations 
    has_many :categories, :through => :categorizations 
end 

class Category < ActiveRecord::Base 
    has_many :categorizations 
    has_many :posts, :through => :categorizations 
end 

class Categorization < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :category 
end 

Использование этих миграций

class CreatePosts < ActiveRecord::Migration 
    def self.up 
    create_table :posts do |t| 
     t.string :title 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :posts 
    end 
end 

class CreateCategories < ActiveRecord::Migration 
    def self.up 
    create_table :categories do |t| 
     t.string :name 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :categories 
    end 
end 

class CreateCategorizations < ActiveRecord::Migration 
    def self.up 
    create_table :categorizations do |t| 
     t.integer :post_id 
     t.integer :category_id 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :categorizations 
    end 
end 
+0

Этот пример не является полиморфным. – cicloon

Смежные вопросы