Я думаю, мне нужно что-то похожее на рельсовый нетерпеливый загруженный запрос с ограничением на него, но у меня возникли проблемы с поиском решения для этого.
Для простоты предположим, что в системе никогда не будет более 30 Person
s (поэтому 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
. (фотографии, статьи и т.д.).