在Rails查询中组合Presenters和#includes

时间:2015-04-21 20:30:29

标签: ruby-on-rails preload presenter

假设我的Rails4应用程序中有以下设置:

学生has_many学位,学位belongs_to学生。我有一个StudentPresenter和一个DegreePresenter也对应这两个模型。 (演讲者as defined here

我想查询以下内容:

student_ids = [1,2,3,4]
students = Student.where(id: student_ids).includes(:degrees)

但我希望能够访问学生和学位的Presenter方法。

如何使用演示者预加载数据?

Rails 4.1.5

1 个答案:

答案 0 :(得分:0)

您链接到的博客文章中的演示者只是简单的ruby对象,在创建新演示者时将模型作为参数之一:

创建StudentPresenters:

students = Student.where(id: student_ids).includes(:degrees)
decorated_students = students.map { |s| StudentPresenter.new(s, view_context) }

然后你可以向StudentPresenter添加一个返回装饰度数的方法;

class StudentPresenter < BasePresenter
  def degrees
    @model.degrees.map { |d| DegreePresenter.new(d, @view) } 
  end
end

预加载如何工作?由于您使用的是includes

  

使用includes,Active Record确保所有指定的   使用尽可能少的查询加载关联。

Rails应该在您students.map后立即加载学生表和学位。