我有一个ActiveRecord查询,例如:
@result = stuff.limit(10)
其中stuff是一个活动记录查询,其中包含where子句,order by等等......
现在我想为什么要将这样的魔法数字传递给控制器?那么你认为定义“limit(10)”的范围并使用它是一个好习惯吗?语法如何?
答案 0 :(得分:41)
确实有多种方法可以做到这一点,类方法是@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)
}
如果您想了解范围和课程方法之间的深层差异,请查看this blog post。
希望它有所帮助。干杯!
答案 1 :(得分:15)
Well Scopes适用于此
作用域允许您指定常用的Arel查询,这些查询可以作为关联对象或模型上的方法调用引用。使用这些范围,您可以使用之前涵盖的每种方法,例如where,joins和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
答案 2 :(得分:15)
在Rails范围中传递参数
范围的定义
scope :name_of_scope, ->(parameter_name) {condition whatever you want to put in scope}
通话方式
name_of_scope(parameter_name)
答案 3 :(得分:2)
范围看起来像任何其他范围(尽管您可能更喜欢类方法),例如,
class Stuff < ActiveRecord::Base
def self.lim
limit(3)
end
end
> Stuff.lim.all
=> [#<Stuff id: 1, name: "foo", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
#<Stuff id: 2, name: "bnar", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
#<Stuff id: 3, name: "baz", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">]
> Stuff.all.length
=> 8
如果始终(或“几乎”总是)想要该限制,请使用默认范围:
class Stuff < ActiveRecord::Base
attr_accessible :name, :hdfs_file
default_scope limit(3)
end
> Stuff.all
=> [#<Stuff id: 1, name: "foo", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
#<Stuff id: 2, name: "bnar", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
#<Stuff id: 3, name: "baz", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">]
> Stuff.all.length
=> 3
跳过默认范围:
> Stuff.unscoped.all.size
=> 8
答案 4 :(得分:1)
带参数的Rails模型中的范围:
scope :scope_name, -> (parameter, ...) { where(is_deleted: parameter, ...) }
或者:
scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)}