Это совсем не сложно создать, например, если у вас есть find
, например:
@all_words = Word.select("words.word")
…, который возвращает результат набор результатов, такой как списокслова вроде этого:
["alphabet", "boy", "day", "donkey", "ruby", "rails", "iPad"]
… вы можете сделать это:
@all_words.collect {|word| word[0,1]}.uniq.sort
, что вернет:
["a", "b", "d", "r", "i"]
.collect {|word| word[0,1]}
хранит первую буквукаждого слова в новый массив, в то время как uniq
отфильтровывает уникальные буквы и sort
сортирует их по алфавиту.
Просто присвойте это переменной, и вы можете использовать ее в своем представлении следующим образом:
<ul>
<% @first_letters.each do |letter| %>
<%= content_tag :li, link_to(letter, words_pagination_url(letter), :title => "Pagination by letter: #{letter}") %>
<% end %>
</ul>
Затем действие вашего контроллера может решить, что делать с параметром из нумерации страниц, если он передан:
def index
if params[:letter]
@words = Word.by_letter(params[:letter])
else
@words = Word.all
end
end
И тогда область действия в вашей модели будет выглядеть примерно так:
scope :by_letter,
lambda { |letter| {
:conditions => ["words.word LIKE ?", "#{letter}%"]
}}
Для ваших маршрутов требуется что-то вроде:
match "words(/:letter)" => "words#index", :as => words_pagination
Я не проверял это все время, но это должно было направить вас на правильный путь.