为什么在使用常规Ruby类方法时会使用作用域?

时间:2016-03-25 06:09:59

标签: ruby-on-rails ruby

作用域

class Comment < ActiveRecord::Base
  scope :most_recent, -> (limit) { order("created_at desc").limit(limit) }
end

使用范围

@recent_comments = Comment.most_recent(5)

班级方法

在模型中

def self.most_recent(limit)
  order("created_at desc").limit(limit)
end

在控制器中

@recent_comments = Comment.most_recent(5)

为什么在使用常规Ruby类方法时会使用作用域?

1 个答案:

答案 0 :(得分:1)

我认为使用scopes的最大原因是因为它总是返回ActiveRecord::Relation,即使范围评估为nil,也不像类方法。除非调用范围,否则您还可以向范围中添加特定方法,这些方法不会出现在类中。

scope :lovely, -> name { where(name: name) if name.present? }
如果没有名字,这将返回集合。但是在课堂方法中,你必须做这样的事情

def self.lovely(name)
  if name.present?
   where(name: name)
  else
   all
  end
end

您可以在此处找到有关范围的更多文档:Active Record scopes vs class methods和此处:Should You Use Scopes or Class Methods?ActiveRecord::Scoping::Named::ClassMethods