ruby-on-rails - 何时以及何时不对命名范围使用 lambda?

标签 ruby-on-rails ruby

我希望了解 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,这自然是不可能写的。

关于ruby-on-rails - 何时以及何时不对命名范围使用 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528122/

相关文章:

ruby-on-rails - rails : List Required Attributes For Create

ruby - 用自己的方法替换对象的通用方法

ruby-on-rails - rbenv 在 mac 上安装在哪里?

mysql - ruby 、MySQL : Connection pool that is outside of the rails framework?

ruby-on-rails - will_paginate 呈现空白结果

html - 为什么我在论坛中的评论没有保存到数据库中?

ruby - 从两个未连接的数据集中获取前 N 条记录

ruby - 如何用 Nokogiri 解析连续的标签?

ruby-on-rails - 重写属性函数rails mongoid

ruby-on-rails - 独立模式下的 Websocket-rails gem FiberError