簡體   English   中英

何時何時不將lambda用於命名范圍?

[英]When to and when not to use lambda for named scopes?

我想了解lambda對這個命名范圍的影響:

我在我的模型上定義了兩個范圍:

scope :credits, lambda { where("comparison_ind != 'PEER'")}

vs

scope :credits, where("comparison_ind != 'PEER'")

這兩個陳述有什么區別? comparison_ind是屬於同一模型的列。

在Rails 4中

總是使用lambda 第二種語法在Rails 4中是不正確的並且會拋出一個錯誤(對於ActiveRecord :: Relation,未定義的方法'call')

# activerecord/lib/active_record/scoping/named.rb
scope = all.scoping { body.call(*args) }

在Rails 3中

scope方法在兩種情況下都表現相同 - 它創建了一個名為credits的新類方法。 區別在於,當給定lambda時,每次調用此新方法獲取范圍時,它都會計算此lambda,而在給定關系時,它只使用已傳遞的內容。

# activerecord/lib/active_record/named_scope.rb
options = scope_options.respond_to?(:call) ? scope_options.call(*args) : scope_options

在這種情況下,lambda總是返回完全相同的關系,因此不會注意到差異。

Lambda表示法通常用於將參數傳遞給作用域:

scope :before, lambda {|date| where.created_at < date}

然后可以使用如下:

Model.before(1.day.ago)

如果沒有lambda,這自然是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM