我正在寻找一个用于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”模型对象中返回。 更改其中任何名称以适应您的需求。
Album.find_by_sql("SELECT DISTINCT SUBSTR(name,1,1) AS 'name' FROM albums ORDER BY 1")