7

アルファベット順のページネーションのためにRailsの宝石を探しています。結果に最初の文字のリストが含まれているといいのですが(つまり、「a」で始まる行がない場合は、ページネーションリンクに「a」を表示したくありません)。この種の宝石はすでに存在しますか?

前もって感謝します!

4

3 に答える 3

12

これを作成するのはそれほど難しくありません。たとえば、次の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

これを最後までテストしたわけではありませんが、正しい道に進むはずです。

于 2011-09-28T22:18:35.127 に答える
5

ここにアルファベット順のページネーションの宝石を作成しました: https://github.com/lingz/alphabetical_paginate

このドメインでまだ問題がある人のために。

于 2013-08-06T19:14:12.863 に答える
5

適切なテーブルから動的選択を取得するには、動的 SQL ファインダを使用できます。

この例では、「albums」という名前のテーブルから選択し、列「name」を作成して値を保持します。これらは「Album」モデル オブジェクトで返されます。必要に応じてこれらの名前を変更します。

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

「名前」フィールドのクエリ以外は Album モデル オブジェクトを使用できないことに注意してください。これは、「name」フィールドのみを入力することで、このオブジェクトにロボトミーを適用したためです。関連付けられている有効な「id」フィールドすらありません!

于 2011-10-16T19:20:31.970 に答える