Какие улучшения могут быть реализованы в сборе и включении в ruby ​​on rails?

У меня очень сложный запрос на начальном уровне, который я не могу решить. Загрузка моей страницы занимает около 6 7 секунд на локальной машине.

Запрос похож на пользователя

self.groups.collect(&:reports).flatten.paginate

Теперь я запускаю цикл, который выглядит примерно так:

reports.each do |report|
  report.name

  report.user.name
  report.user.image.attachment.url(:thumb)   #User has_one :image , Image belongs_to :user

  report.questions.each do |question|
    question.name 

    question.answers.each do |answer|
      answer.name
    end
  end

  report.comments.each do |comment|
    comment.name 
    comment.user.name
    comment.user.image.attachment.url(:thumb)   #User has_one :image , Image belongs_to :user
  end

end

В нем много вложенных циклов, которые требуют большого количества включений, но я не могу понять, в каком направлении мне следует действовать. Мой предыдущий вопрос был N+1 в отношениях rails с активными записями?

------------------РЕДАКТИРОВАТЬ----

я могу сделать

self.groups.includes(:reports => [:user, :questions]) 

or

self.groups.includes(:reports => [:user => [:image]]) 

но нет

 self.groups.includes(:reports => [:user => [:image], :questions]) 

что с этим не так??

------------------РЕДАКТИРОВАТЬ----

self.groups.includes(:reports => [:questions, :user => [:image]]).collect(&:reports).flatten.paginate(:page => page, :per_page => 6)    

Это то, что, кажется, работает для меня без дополнительной/менее энергичной загрузки в соответствии с пулей ( https://github.com/flyerhzm/bullet ), но для загрузки запросов требуется около 10 секунд, и это похоже на огромную нагрузку. Предлагаются ли какие-либо дальнейшие улучшения ??

------------------РЕДАКТИРОВАТЬ----

 self.groups.includes(:reports => [:questions, .........]).collect(&:reports).paginate

изменился на

self.group_reports.includes(:questions, ....... ).paginate

очень помог

В User Model определено что-то вроде

has_many :reports
has_many :group_reports, :through => :groups, :source => :reports

person Sahil Grover    schedule 22.12.2012    source источник


Ответы (1)


Попробуйте использовать хэш: self.groups.includes(:reports => [:questions, {:user => :image}])

person VadimAlekseev    schedule 22.12.2012
comment
отредактировал мой вопрос, пожалуйста, посмотрите. - person Sahil Grover; 22.12.2012
comment
да, это сработало, и изменение отношения немного сэкономило время выполнения 7 секунд в небольшой базе данных - person Sahil Grover; 23.12.2012