Полиморфный Eager Load has_many: через ассоциации в ActiveRecord? - PullRequest
4 голосов
/ 20 сентября 2010

Как вы хотите загружать полиморфные has_many :through ассоциации в Rails / 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

Это не работает, есть идеи?

1 Ответ

0 голосов
/ 21 сентября 2010

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

С has_many: through вы можете использовать этот запрос 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
...