将参数添加到范围

我有一个ActiveRecord查询,例如:

@result = stuff.limit(10) 

其中stuff是一个活动的记录查询,其中where子句,order by等等…

现在我想为什么要将这样的魔法数字传递给控制器​​? 那么你认为定义“limit(10)”的范围并使用它是一个好习惯吗? 语法如何?

范围看起来像任何其他(尽管您可能更喜欢类方法),例如,

 class Stuff < ActiveRecord::Base def self.lim limit(3) end end > Stuff.lim.all => [#, #, #] > Stuff.all.length => 8 

如果您总是 (或“几乎”总是)想要该限制,请使用默认范围:

 class Stuff < ActiveRecord::Base attr_accessible :name, :hdfs_file default_scope limit(3) end > Stuff.all => [#, #, #] > Stuff.all.length => 3 

要跳过默认范围:

 > Stuff.unscoped.all.size => 8 

确实存在多种方法,类方法是@Dave Newton指出的方法。 如果您想使用范围,请按以下步骤操作:

 scope :max_records, lambda { |record_limit| limit(record_limit) } 

或者使用Ruby 1.9“stabby”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) 

Well Scopes就是为了这个目的

作用域允许您指定常用的Arel查询,这些查询可以作为关联对象或模型上的方法调用引用。 使用这些范围,您可以使用之前涵盖的每个方法,例如where,join和includes。 所有范围方法都将返回一个ActiveRecord :: Relation对象,该对象将允许在其上调用更多方法(例如其他范围)。

资料来源: http : //guides.rubyonrails.org/active_record_querying.html#scopes

因此,如果您认为您有一些常见的查询,或者您需要在查询中进行某种链接,这对许多人来说是很常见的。 然后我建议你去范围防止重复。

现在回答一下范围在您的情况下的样子

 class YourModel < ActiveRecord::Base scope :my_limit, ->(num) { limit(num)} scope :your_where_condition, ->(num) { where("age > 10").mylimit(num) } end 

带参数的Rails模型中的范围:

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

要么:

 scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)}