Ruby on rails 向作用域添加参数

Ruby on rails 向作用域添加参数,ruby-on-rails,ruby-on-rails-3.2,rails-activerecord,Ruby On Rails,Ruby On Rails 3.2,Rails Activerecord,我有一个ActiveRecord查询,例如: @result = stuff.limit(10) where stuff是带有where子句、order by等的活动记录查询 现在我想为什么要把这样的魔法数字传给控制器?那么,您认为定义“限制(10)”的范围并使用它是否是一种好的做法?语法会是什么样的呢?好的范围就是这个意思 作用域允许您指定常用的Arel查询,这些查询可以作为关联对象或模型的方法调用引用。有了这些作用域,您可以使用前面介绍的每个方法,例如where、join和include。

我有一个ActiveRecord查询,例如:

@result = stuff.limit(10)
where stuff是带有where子句、order by等的活动记录查询


现在我想为什么要把这样的魔法数字传给控制器?那么,您认为定义“限制(10)”的范围并使用它是否是一种好的做法?语法会是什么样的呢?

好的范围就是这个意思

作用域允许您指定常用的Arel查询,这些查询可以作为关联对象或模型的方法调用引用。有了这些作用域,您可以使用前面介绍的每个方法,例如where、join和include。所有作用域方法都将返回一个ActiveRecord::Relation对象,该对象将允许对其调用其他方法(如其他作用域)

资料来源:

因此,如果您觉得有一些常见的查询,或者您需要在查询中使用某种链接,这对许多人来说都是常见的。然后我建议你使用示波器来防止重复

现在回答一下在您的案例中范围是什么样子的

class YourModel < ActiveRecord::Base
  scope :my_limit, ->(num) { limit(num)} 
  scope :your_where_condition, ->(num) { where("age > 10").mylimit(num) } 
end
classyourmodel(num){limit(num)}
范围:你的条件,->(num){where(“年龄>10”).mylimit(num)}
结束

作用域与任何其他作用域类似(尽管您可能更喜欢类方法),例如


确实有多种方法可以做到这一点,正如@Dave Newton所指出的,类方法就是其中之一。如果要使用作用域,请按以下方式操作:

scope :max_records, lambda { |record_limit|
  limit(record_limit)
}
或者使用Ruby 1.9“Thanky”lambda语法和多个参数:

scope :max_records, ->(record_limit, foo_name) {   # No space between "->" and "("
  where(:foo => foo_name).limit(record_limit)
}
如果您想知道作用域和类方法之间更深层次的区别,请查看


希望能有帮助。干杯

在Rails范围内传递参数

范围定义

scope :name_of_scope, ->(parameter_name) {condition whatever you want to put in scope}
调用方法

name_of_scope(parameter_name)

Rails模型中的范围和参数:

scope :scope_name, -> (parameter, ...) { where(is_deleted: parameter, ...) }  
或:


我认为范围不相关。如果您的限制出现在多个位置,则Model.rb中可能有一个常量(表示常量
MAX\u ITEMS\u PER\u PAGE
)+1,用于显示如何使用参数;我不确定我是否应该打扰。在上面的Thanky lambda示例中,small明白了:stab运算符和打开参数列表的括号之间不允许有空格。@Jacob刚刚遇到了这个问题。编辑他的答案以删除空格。您还可以向参数添加默认值
范围:max\u records,->(record\u limit=10)
scope :name_of_scope, ->(parameter_name) {condition whatever you want to put in scope}
name_of_scope(parameter_name)
scope :scope_name, -> (parameter, ...) { where(is_deleted: parameter, ...) }  
scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)}