这根本不难创建,例如,如果您有一个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"]
The .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
我还没有完全测试过这一点,但它应该会让你走上正确的道路。