cts-as-taggable-on - Как вы получаете теги по родительскому объекту - PullRequest
0 голосов
/ 01 сентября 2011

Если у меня есть две модели, ведра и фотографии. Buckets has_many Фотографии и фото принадлежат Bucket. Если бы я затем добавил теги к фотографиям, используя жемчужину Act-as-Taggable-On. Каков наилучший способ (идиоматический и хорошо работает), чтобы получить уникальный список тегов по Bucket? или за одно ведро?

1 Ответ

1 голос
/ 01 сентября 2011

Как-то так должно отвечать вашему запросу

# 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.

...