acts_as_taggable + will_paginate = работаем вместе

Представте, что вы разрабатываете небольшой блог на Ruby on Rails. Понятное дело там будет постраничный вывод статей и теги для статей (иначе не кавайно по другому :) ). Но тут возникает одна проблема. Вы например вывели облако тегов на страницу для пользователя. И при нажатии пользователю на тег должны выводится статьи, которые помечены только этим тегом. А если статей много? Тогда нужен еще и постраничный вывод. Плагин acts_as_taggable не позволяет нам такое сделать. Как же быть? Очень просто.

Создаем в папку lib нашего Rails приложения файл paginated_tags.rb (RAILS_ROOT/lib/paginated_tags.rb) и добавим туда такой контент:

  1. module ActiveRecord
  2.   module Acts #:nodoc:
  3.     module Taggable #:nodoc:
  4.       module SingletonMethods
  5.  
  6.         def find_tagged_with(list,*args)
  7.           #build the limit sql
  8.           options = args.last.is_a?(Hash) ? args.pop.symbolize_keys : {}
  9.           limit,offset = options.delete(:limit), options.delete( :o ffset)
  10. unless options.empty?
  11.           scope =  (limit && offset) ? "LIMIT #{offset}, #{limit}" : ""
  12.  
  13.           find_by_sql([
  14.             "SELECT #{table_name}.* FROM #{table_name}, tags, taggings "
  15. +
  16.             "WHERE #{table_name}.#{primary_key} = taggings.taggable_id "
  17. +
  18.             "AND taggings.taggable_type = ? " +
  19.             "AND taggings.tag_id = tags.id AND tags.name IN (?)
  20. #{scope}",
  21.             acts_as_taggable_options[:taggable_type], list
  22.           ])
  23.  
  24.         end
  25.         #will_paginate will call find_all_tagged_with
  26.         alias find_all_tagged_with find_tagged_with
  27.       end
  28.     end
  29.   end
  30. end
  31.  

Все! Теперь что бы взять страничный вывод по тегу делаем такой вызов

  1. stories = Story.paginate_tagged_with("goo", :total_entries => 2,  :page => params[:page])
  2.  

03. января 2010 by Alexey Vasiliev
Categories: Ruby, Ruby on Rails | Tags: , | Комментарии отключены