添加参数的范围(Adding parameter to a scope)

2019-08-17 07:23发布

我有例如像这样的ActiveRecord的查询:

@result = stuff.limit(10)

这里的东西是,等一个活动记录查询WHERE子句,为了...

现在,我想为什么通过幻数这样的控制器? 那么你认为它是一个很好的做法,定义“限制(10)”并使用它的作用域? 和语法如何将会是什么样子?

Answer 1:

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

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


Answer 2:

的确有做这样的多种方法,类方法是一个由@戴夫牛顿指出。 如果您想使用范围,方法如下:

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)
}

如果你想知道的范围和类方法之间的更深层次的差异,看看这个博客帖子 。

希望能帮助到你。 干杯!



Answer 3:

那么作用域都是为了这个

作用域允许您指定可作为参考方法调用的关联对象或模型常用阿雷尔查询。 有了这些范围,你可以使用以前每次覆盖,如在哪里,联接和包括方法。 所有范围的方法会返回一个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


Answer 4:

通过在Rails的范围参数

范围定义

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

调用方法

name_of_scope(parameter_name)


Answer 5:

适用范围与参数Rails的模型:

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

要么:

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


文章来源: Adding parameter to a scope