Rails 中的字母分页

7
我正在寻找一个用于Rails的按字母顺序分页的宝石。我希望能够获得结果中发现的首字母列表(我的意思是,如果没有以“a”开头的行,则不希望在分页链接上显示“a”)。这种宝石已经存在了吗?
提前感谢!
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

我没有全面测试过这个,但它应该让你走上正确的道路。


有没有一种通过SQL来完成第一部分的方法? - Mathieu Mahé
如果我们谈论成千上万个单词怎么办?不确定这是否适用于几十个…… - mga
3
如果你有数万个单词,很可能涵盖整个字母表,那么为什么不直接输出字母表并链接到每个字母:“(“a”..“z”)。to_a” - Pete

5

要从适当的表中获取动态选择,您可以使用动态SQL查找器。

在此示例中,我们从名为“albums”的表中进行选择,并制作一个名为“name”的列来保存值。 这些将在“Album”模型对象中返回。 更改其中任何名称以适应您的需求。

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

请注意,您无法使用Album模型对象进行除查询“name”字段之外的任何操作。这是因为我们通过仅填充“name”字段来使此对象失去了其功能——甚至没有关联的有效“id”字段!

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接