加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails:lambda,scope和class方法有什么区别?

发布时间:2020-12-16 19:36:14 所属栏目:百科 来源:网络整理
导读:代码片段有三种方法:lambda,scope和class方法. 所有这些都返回相同的结果. 问题: Ruby / Rails中有哪些优先使用一种? 在什么情况下您将使用lambda,scope或class方法(最佳做法). class Cars ActiveRecord::Base attr_accessible :manufacturer,:price,:use
代码片段有三种方法:lambda,scope和class方法.

所有这些都返回相同的结果.

问题:

> Ruby / Rails中有哪些优先使用一种?
>在什么情况下您将使用lambda,scope或class方法(最佳做法).

class Cars < ActiveRecord::Base     
  attr_accessible :manufacturer,:price,:used

  #one
  scope :used_and_cheap_lambda,lambda { where('used = ?',true ).where('price >= ?',30000) }

  #two
  scope :used_and_cheap_scope,where('used = ?',30000)

  #three
  def self.used_and_cheap_class
    where('used = ?',30000)
  end
end





Cars.used_and_cheap_lambda.count
=> #24

Cars.used_and_cheap_class.count
=> #24

Cars.used_and_cheap_scope.count
=> #24

解决方法

最好避免使用选项2.当您的Rails应用程序加载不正确时,该代码将立即运行,因为它将始终为您使用的任何Time参数返回相同的值.这是因为它每次调用时都不会被重新评估.

选择1,如musicnerd47所指出的,它们是懒惰的,并且建议您将Lambdas传递给Rails 4中的范围,而不是执行选项2,因为每次调用它们都将被重新评估,因此它们将返回更新的值.

所以唯一的选择是1和3.这通常是你的团队坚持的风格问题.在我们公司,我们使用选项1,当我们传递给它的代码将是一个ActiveRecord查询,我们希望它输出一个可以链接的查询.这是为了确保每次对多个记录进行查询时都会返回一个ActiveRecord :: Relation对象.这意味着它们总是可以与其他ActiveRecord :: Relation方法和我们其他定义的范围链接.

如果用于不需要与其他范围链接的行为,则使用选项3.

以下是对范围和class_methods的详细介绍,他详细介绍了范围和类方法之间的区别.
http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读