アルファベット順のページネーションのためにRailsの宝石を探しています。結果に最初の文字のリストが含まれているといいのですが(つまり、「a」で始まる行がない場合は、ページネーションリンクに「a」を表示したくありません)。この種の宝石はすでに存在しますか?
前もって感謝します!
アルファベット順のページネーションのためにRailsの宝石を探しています。結果に最初の文字のリストが含まれているといいのですが(つまり、「a」で始まる行がない場合は、ページネーションリンクに「a」を表示したくありません)。この種の宝石はすでに存在しますか?
前もって感謝します!
これを作成するのはそれほど難しくありません。たとえば、次の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
これを最後までテストしたわけではありませんが、正しい道に進むはずです。
ここにアルファベット順のページネーションの宝石を作成しました: https://github.com/lingz/alphabetical_paginate
このドメインでまだ問題がある人のために。
適切なテーブルから動的選択を取得するには、動的 SQL ファインダを使用できます。
この例では、「albums」という名前のテーブルから選択し、列「name」を作成して値を保持します。これらは「Album」モデル オブジェクトで返されます。必要に応じてこれらの名前を変更します。
Album.find_by_sql("SELECT DISTINCT SUBSTR(name,1,1) AS 'name' FROM albums ORDER BY 1")
「名前」フィールドのクエリ以外には Album モデル オブジェクトを使用できないことに注意してください。これは、「name」フィールドのみを入力することで、このオブジェクトにロボトミーを適用したためです。関連付けられている有効な「id」フィールドすらありません!