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类方法时,为什么要使用作用域?

最佳答案 我认为使用范围的最大原因是因为它总是会返回一个ActiveRecord :: Relation,即使范围的计算结果为nil,也不像class方法.除非调用范围,否则还可以向范围中添加特定方法,这些方法不会出现在类中.

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

点赞