11

如果您访问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])
4

2 回答 2

21
# 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
于 2013-11-05T01:04:51.307 回答
3

我不明白你为什么不使用查询链接:

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

但更好的是,像 Michael Lynch 所说的那样创建一个范围,它将增加您的代码可重用性。

实际上,您的代码正在发出弃用警告。您必须在 Rails 服务器终端窗口中检查它。尽管它正在工作,但放任不管不是一个好主意。

弃用警告:不推荐调用#find(:all)。请改为直接调用#all。您还使用了查找器选项。这些也已弃用。请建立一个范围,而不是使用查找器选项。(从 (irb):1 的 irb_binding 调用)

于 2013-11-05T01:43:22.167 回答