最主要区别在有条件判断时候,返回值类型不一样,会影响后续跟链式方法
- scope返回的总是ActiveRecord::Relation,后面可以直接跟链式方法。
- 类方法在有条件判断为false时返回的是nil,后面跟链式方法会报错NoMethodError
1. 不传参数
- scope 返回ActiveRecord::Relation
class Post < ApplicationRecord
belongs_to :user
scope :active, -> { where(status: 1) }
end
- class method 返回ActiveRecord::Relation
class Post < ApplicationRecord
belongs_to :user
def self.active
where(status: 1)
end
end
- 使用
Post.active.count
或者 User.first.posts.count
都可以,count前面返回值是ActiveRecord::Relation
2. 传参数,不传条件
- scope 返回ActiveRecord::Relation
class Post < ApplicationRecord
belongs_to :user
scope :active, ->(status) { where(status: status) }
end
- class method 返回ActiveRecord::Relation
class Post < ApplicationRecord
belongs_to :user
def self.active(status)
where(status: status)
end
end
- 使用
Post.active.count
或者 User.first.posts.count
都可以,count前面返回值是ActiveRecord::Relation
3.(重点:这里会不一样) 传参数,传条件
- scope 条件为true或false时,后面都可以接着链接其他方法如
Post.active.count
,为false时这条where条件不执行,但不报错
class Post < ApplicationRecord
belongs_to :user
scope :active, ->(status) { where(status: status) if status.is_a?(Numeric) }
end
- class method 条件为true时,后面可以接着链接其他方法如
Post.active.count
,为false时,方法会返回nil ,Post.active.count
会报错NoMethodError: undefined method 'count' for nil:NilClass
class Post < ApplicationRecord
belongs_to :user
def self.active(status)
where(status: status) if status.is_a?(Numeric)
end
end