如何在Rails中按字母顺序对电影进行排序?

时间:2013-11-05 00:53:56

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

如果你访问http://ccvideofinder.heroku.com/,这是我所指的一个很好的例子。

如何在Rails中完成?我想也许可以使用case / when语句,但在与IRB搞砸了一段时间后,我无法理解。


在模型中:

class Movies < ActiveRecord::Base
  validates_presence_of :title

  def self.find_by_first_letter(letter)
    find(:all, :conditions => ['title LIKE ?', "#{letter}%"], :order => 'title ASC')
  end

end

在控制器中:

@result = Movie.find_by_first_letter(params[:letter])

2 个答案:

答案 0 :(得分:17)

# Simple Ordering    
@videos = Movie.order('title ASC')

# Implement the ordering outside of definition
@videos = Movie.find_by_first_letter('a').order('title ASC')

# Implement the order into your definition (as in example below)
@videos = Movie.find_by_first_letter('a')

可以找到ActiveRecord查询的文档: http://guides.rubyonrails.org/active_record_querying.html#ordering


如果您希望在find_by_first_letter定义中实施订单,则可以将.order()函数链接起来,如下所示:

class Movie < ActiveRecord::Base
  validates_presence_of :title

  def self.find_by_first_letter(letter)
    where('title LIKE ?', "#{letter}%").order('title ASC')
  end
end

答案 1 :(得分:3)

我无法理解你为什么不使用查询链接:

Movie.where('title LIKE ?', "a%").order(:title)

但更好的是,像迈克尔林奇所说,创建一个范围,它将增加你的代码可重用性。

实际上您的代码提供了弃用警告。您必须在Rails服务器终端窗口中检查它。尽管它正在发挥作用但让它不受控制并不是一个好主意。

  

DEPRECATION WARNING:不推荐调用#find(:all)。请直接致电#all。您还使用了finder选项。这些也被弃用了。请构建范围而不是使用finder选项。 (从(irb)的irb_binding调用:1)