将参数添加到范围
我有一个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, ...)}