我正在为 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
我没有一直测试这个,但它应该让你走上正确的道路。
要从适当的表中获取动态选择,您可以使用动态 SQL 查找器。
在此示例中,我们从名为“albums”的表中进行选择,并制作一个“name”列来保存值。这些将在“专辑”模型对象中返回。更改这些名称中的任何一个以满足您的需要。
Album.find_by_sql("SELECT DISTINCT SUBSTR(name,1,1) AS 'name' FROM albums ORDER BY 1")
请注意,除了查询“名称”字段外,您不能将专辑模型对象用于任何事情。这是因为我们只通过填充“名称”字段为该对象进行了脑叶切除术 - 甚至没有关联的有效“id”字段!
我在这里创建了一个字母分页宝石: https ://github.com/lingz/alphabetical_paginate
对于在此域中仍有问题的任何人。