Rails Eager Load and Limit

Я думаю, мне нужно что-то похожее на рельсовый нетерпеливый загруженный запрос с ограничением на него, но у меня возникли проблемы с поиском решения для этого.

Для простоты предположим, что в системе никогда не будет более 30 Persons (поэтому Person.all— небольшой набор данных), но каждый человек будет содержать более 2000 комментариев (поэтому Person.include(:comments)будет большим набором данных).

Родительская ассоциация

class Person < ActiveRecord::Base
  has_many :comments
end

Дочерняя ассоциация

class Comment < ActiveRecord::Base
  belongs_to :person
end

Мне нужно запросить список Personи включить их комментарии, но мне нужно только 5 из них.

Я хотел бы сделать что-то вроде этого:

Ограниченная родительская ассоциация

class Person < ActiveRecord::Base
  has_many :comments
  has_many :sample_of_comments, \
    :class_name => 'Comment', :limit => 5
end

Контроллер

class PersonController < ApplicationController
  def index
    @persons = Person.include(:sample_of_comments)
  end
end

К сожалению, в этой статьеговорится: «Если вы хотите загрузить ассоциацию с указанной опцией :limit , он будет проигнорирован, и будут возвращены все связанные объекты"

Есть ли хороший способ обойти это? Или я обречен выбирать между нетерпеливой загрузкой тысяч ненужных объектов ActiveRecord и запросом N+1? Также обратите внимание, что это упрощенный пример. В реальном мире у меня будут другие ассоциации с Personв том же действии indexс той же проблемой, что и comments. (фотографии, статьи и т.д.).

6
задан Chad M 21 March 2012 в 16:20
поделиться