铁轨中的字母分页

Mat*_*ahé 7 gem pagination ruby-on-rails alphabetical

我正在寻找Rails的宝石,用于按字母顺序分页.我希望我能得到结果中找到的第一个字母列表(我的意思是,如果没有以'a'开头的行,我不希望在分页链接上显示'a').这种宝石已经存在吗?

提前致谢!

Pet*_*ete 11

这根本不容易创建,例如,如果你有一个find,可能像:

@all_words = Word.select("words.word")
Run Code Online (Sandbox Code Playgroud)

...返回一个结果集的结果,如这样的单词列表:

["alphabet", "boy", "day", "donkey", "ruby", "rails", "iPad"]    
Run Code Online (Sandbox Code Playgroud)

......你可以这样做:

@all_words.collect {|word| word[0,1]}.uniq.sort
Run Code Online (Sandbox Code Playgroud)

将返回:

["a", "b", "d", "r", "i"]
Run Code Online (Sandbox Code Playgroud)

.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>
Run Code Online (Sandbox Code Playgroud)

然后,您的控制器操作可以决定如果传入一个paramination中的param:

def index
    if params[:letter]
        @words = Word.by_letter(params[:letter])
    else
        @words = Word.all
    end
end
Run Code Online (Sandbox Code Playgroud)

然后,模型中的范围看起来像:

scope :by_letter,
        lambda { |letter| {
            :conditions => ["words.word LIKE ?", "#{letter}%"]
        }}
Run Code Online (Sandbox Code Playgroud)

您的路线需要以下内容:

match "words(/:letter)" => "words#index", :as => words_pagination
Run Code Online (Sandbox Code Playgroud)

我没有一直测试这个,但它应该让你走上正确的道路.

  • 如果你有成千上万的单词可能覆盖整个字母表,那么为什么不输出字母表并链接到每个字母:`("a".."z").to_a` (3认同)

小智 5

要从适当的表中进行动态选择,可以使用动态SQL查找程序.

在此示例中,我们从名为"albums"的表中进行选择,并制作列"name"来保存值.这些将在"Album"模型对象中返回.更改任何这些名称以满足您的需求.

Album.find_by_sql("SELECT DISTINCT SUBSTR(name,1,1) AS 'name' FROM albums ORDER BY 1")
Run Code Online (Sandbox Code Playgroud)

请注意,您不能使用相册样板对象的任何东西,除了查询"名称"字段.这是因为我们只通过填充'name'字段给这个对象进行了一次切除术 - 甚至没有关联的有效'id'字段!


Xiv*_*Xiv 5

我在这里创建了一个按字母顺序排列的分页宝石:https: //github.com/lingz/alphabetical_paginate

对于仍然在此域中存在问题的任何人.