алфавитная пагинация в рельсах - PullRequest
7 голосов
/ 29 сентября 2011

Я ищу драгоценный камень для Rails для алфавитной нумерации страниц. Мне бы хотелось, чтобы в результате был найден список первых букв (я имею в виду, что если строки, начинающейся с «а», нет, я не хочу, чтобы «а» отображалось в ссылках на нумерацию страниц). Этот камень уже существует?

Заранее спасибо!

Ответы [ 3 ]

11 голосов
/ 29 сентября 2011

Это совсем не сложно создать, например, если у вас есть 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

Я не проверял это все время, но это должно было направить вас на правильный путь.

5 голосов
/ 06 августа 2013

Я создал алфавит нумерации страниц здесь: https://github.com/lingz/alphabetical_paginate

Для тех, у кого все еще есть проблемы в этой области.

5 голосов
/ 16 октября 2011

Чтобы получить динамический выбор из соответствующей таблицы, вы можете использовать динамический искатель SQL.

В этом примере мы выбираем из таблицы с именем «альбомы» и изготавливаем столбец «имя» для хранения значений. Они будут возвращены в объекте модели «Альбом». Измените любое из этих имен в соответствии с вашими потребностями.

Album.find_by_sql("SELECT DISTINCT SUBSTR(name,1,1) AS 'name' FROM albums ORDER BY 1")

Обратите внимание, что вы не можете использовать объекты модели Album для чего-либо , кроме запроса поля 'name'. Это потому, что мы дали этому объекту лоботомию, заполнив только поле 'name' - с ним даже не связано действительное поле 'id'!

...