Proc.new 约等于 lambda
- 控制权順序不同:lambda 會將控制权丟回呼叫 method 本身,继续往下执行,而 Proc 的 return 则不会,是立即跳出。
- 检查参数: lambda 会对参数进行检查,如果是 nil 則會直接拋出 error,而 Proc 則是以 nil 当参数帶入。
- Scope 运用在 Rails 的 ActiveRecord Model,要获取资料时,都会使用 lambda 來進行,原因就是 lambda 更谨慎。
基本用法
class Book < ApplicationRecord
scope :with_author, -> { where(author: "CY") }
scope :with_page_count, -> { where("page_count > 100") }
scope :with_author, ->(Name) { where(author: name) }
scope :with_page_count, ->(count) { where("page_count > ?", count) }
end
Book.with_author.with_page_count.last(3)
寻找作者为 CY 且页数大于 100 的书,并取最后 3 本。
Scope 和 Class method 的比较
- scope 的代码更简洁
- scope 返回值一定是 ActiveRecord::Relation,但 Class method 不一定。
Default Scopes
default_scope { where(published: true) } 只要获取 book 数据时,都只会获取到 published 为 true 的 book. unscoped_book = Book.unscoped.find(book_id) 想取消 default scope 时。