当我尝试使用范围时,为什么会出现此错误?

时间:2013-01-21 00:47:05

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

我收到此错误。

  

的未定义方法'recent'

我的代码是

用户控制器

@users = User.find_by_username(params[:id]).all_following.recent

用户模型

scope :recent, lambda { |n = 10| order("last_active_at DESC").limit(n) }

3 个答案:

答案 0 :(得分:1)

如果使用lambda,它应该采取参数?如果你确切知道限制是什么,不需要使用lambda

尝试查看本指南 13.2 http://guides.rubyonrails.org/active_record_querying.html#working-with-scopes

答案 1 :(得分:1)

来自gem文档all_following是一个数组。这个数组甚至可能是非同类的。

recent范围实际上是一种可以在ActiveRecord上调用的方法。

我担心这两个人不匹配,这就是错误导致您无法在recent的实例上调用Array的原因

我希望有所帮助。

答案 2 :(得分:1)

我认为这不可能使用范围,因为all_following方法将返回一个数组,因此它甚至不会在User模型中查找以尝试查找范围。不应该使用范围的另一个原因是范围是以您想要重用的特定方式从数据库中提取项目,而不是对事物进行排序。为了获得你想要的功能,我会像这样在Array类中添加一个方法:

class Array
  def recent(limit = 10)
    self.sort_by { |users| users[:last_active_at] }[0..(limit-1)]
  end
end

然后,您可以在控制器中调用@users = User.find_by_username(params[:id]).all_following.recent(3),并传入您想要的任何值作为限制值。如果您不使用限制值,例如使用@users = User.find_by_username(params[:id]).all_following.recent,那么它将使用10作为默认值。