Я думаю, что мне нужно что-то похожее на загруженный рельсами запрос с ограничением, но у меня возникли проблемы с поиском решения для этого.
Ради простоты, скажем, что в системе никогда не будет более 30 Person
с (поэтому Person.all
- это небольшой набор данных), но у каждого человека будет более 2000 комментариев (поэтому Person.include(:comments)
будет большой набор данных).
Родительская ассоциация
class Person < ActiveRecord::Base
has_many :comments
end
Детское объединение
class Comment < ActiveRecord::Base
belongs_to :person
end
Мне нужно запросить список Person
с и включить их comments
, но мне нужно только 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, она будет проигнорирована, возвращая все связанные объекты»
Есть ли хороший способ обойти это? Или я обречен выбирать между энергичной загрузкой 1000 ненужных объектов ActiveRecord и запросом N + 1? Также обратите внимание, что это упрощенный пример. В реальном мире у меня будут другие ассоциации с Person
, в том же действии index
с той же проблемой, что и comments
. (фотографии, статьи и т. д.).