ruby-on-rails - Eager Load Polymorphic has_many :through Associations in ActiveRecord?

标签 ruby-on-rails activerecord polymorphic-associations

你如何急切加载多态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 的这个急切加载问题,以及 join 模型上的双多态关联,你如何急切加载 :through像这样的关联:
posts = Post.all(:include => {:categories => :categorizations})
post.categories # no SQL call because they were eager loaded

这是行不通的,有什么想法吗?

最佳答案

使用 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

关于ruby-on-rails - Eager Load Polymorphic has_many :through Associations in ActiveRecord?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3753903/

相关文章:

ruby-on-rails - Rails 4 - 设计:在注册时获取 ActionController::UnknownFormat

ruby-on-rails - 单表继承在 Rails 4 应用程序中不起作用 - ActiveRecord::SubclassNotFound:单表继承机制失败

ruby-on-rails - 检查记录是否刚刚在 rails 中被破坏

ruby-on-rails - RoR成绩系统-多态关联和设计问题

ruby-on-rails - 为什么这个多态关联的 source_type 总是 0?

ruby-on-rails - 如何在 Rails 中指定 block 内的路由成员?

mysql - 带有表连接的 Ruby on Rails 模型

ruby-on-rails - RoR ActiveRecord::Base uniq 在尝试 uniq.pluck(:column_name) 时未定义

ruby-on-rails - 如何在 Rails 中测试非 ActiveRecord 模型?

ruby-on-rails - 多态 Controller 和调用对象