Как-то так должно отвечать вашему запросу
# in your bucket class
def tag_list
photos.inject([]) do |tags, photo|
# with inject syntax
tags + photo.tags.map(&:name) # remove the maps call if you need tag objects
end.uniq
end
def alternative_tag_list
# this code is even simpler, return unique tags
photos.map { |p| p.tags }.flatten.uniq
end
Вы должны сравнить их. Они должны хорошо работать с небольшим количеством данных, и вы всегда можете использовать памятку или кэш для результата . Вы можете уменьшить количество запросов, выбирая объект корзины, включая фотографии и теги, с помощью include (), как в
@bucket = Bucket.includes(:photos).includes(:tags).find(params[:id])
Если тест не подходит, вы должны использовать SQL, но тогда вы потеряете синтаксический сахар inject & co.