作用域
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类方法时会使用作用域?
答案 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