code片段有三种方法:lambda、scope和class method。
它们都返回相同的结果。
问题:
Ruby/Rails中有什么最佳实践是首选的,而不是另一个呢?lambda、scope或class方法(最佳实践)。
Cars < ActiveRecord::Base attr_accessible :出厂,:price,:used #one scope :used_and_cheap_lambda,λ{ where('used =?,true ).where(‘>=?,30000’)}#双作用域:used_and_cheap_scope,其中(‘used=?,true ).where(’.where >=‘,30000) #three def self.used_and_cheap_class where('used = ?',(真).where(“价格>=?”,30000)结束Cars.used_and_cheap_lambda.count => #24 Cars.used_and_cheap_class.count => #24 Cars.used_and_cheap_scope.count => #24发布于 2013-12-15 17:29:06
最好避免使用选项2,这段代码在Rails应用程序加载时立即运行,这很糟糕,因为它在任何时候都会返回相同的值。这是因为它不是每次被调用时都会被重新评估。
正如musicnerd47所指出的,选项1是延迟加载的,您最好将lambda传递给Rails 4中的作用域,而不是执行选项2,因为每次调用它们时都会重新计算它们,因此它们将返回更新的值。
所以唯一的选择是1和3,这通常是你的团队所坚持的风格问题。在我们的公司中,当我们传递给它的代码是一个ActiveRecord查询时,我们使用选项1,我们希望它输出一个可以链接的查询。这是为了确保每次查询多个记录时都返回ActiveRecord::Relation对象。这意味着它们总是可以与其他ActiveRecord::Relation方法和我们定义的其他作用域链接。
如果选择3用于不需要与其他作用域链接的行为,则使用选项3。
这里很好地介绍了作用域和class_methods的内容,他详细介绍了这些内容,并举例说明了作用域和类方法之间的区别。http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/
发布于 2013-12-15 17:18:04
从Rails 4开始,您必须使用lambda --一般来说,这是一个更好的实践,因为它是懒惰加载的,并且防止了很多陷阱,特别是在处理日期和时间时。
我认为对于处理单个where调用之类的简单范围来说,使用scope是可以的。当它更复杂时,那么移动到类方法会更好(例如,在返回作用域之前,您需要调用其他方法或设置局部变量)。
发布于 2013-12-15 16:59:59
我会用蓝光。您所描述的函数非常简单。使用lambda也会延迟初始化。我向您介绍这里的rails样式指南。
https://stackoverflow.com/questions/20597139
复制相似问题