2013-03-05 144 views
15

我有一個這樣的ActiveRecord的查詢,例如:添加參數的範圍

@result = stuff.limit(10) 

那裏的東西是WHERE子句,ORDER BY等等

現在我想到了一個活動記錄查詢爲什麼要將這樣的幻數傳遞給控制器​​?所以你認爲定義一個範圍爲「limit(10)」並使用它是一個好習慣嗎?以及語法如何?

+0

我不認爲一個範圍是相關的。如果您的限制出現在多個位置(讓我們說常量「MAX_ITEMS_PER_PAGE」) – MrYoshiji 2013-03-05 16:28:03

回答

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 
13

好作用域都是爲了這個

作用域允許您指定可作爲參考方法調用的關聯對象或模型常用阿雷爾查詢。通過這些範圍,您可以使用之前涵蓋的每種方法,例如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 
35

確實有做這樣的多種方法,類方法是一個由@戴夫牛頓指出。如果您想使用範圍,方法如下:

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

希望它有幫助。乾杯!在Rails的範圍

+1

+1,以顯示如何使用參數,那麼可以在Model.rb中使用常數。我不確定我是否應該打擾。 – 2013-03-05 19:24:05

+2

上面的stabby lambda示例中的小問題:在stab運算符和打開參數列表的括號之間沒有空格。 – Jacob 2014-05-16 15:02:57

+1

@Jacob剛纔碰到了這個。編輯他的答案,以消除空間。 – 2014-09-10 01:18:24

12

傳遞參數

的範圍定義

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

調用方法

name_of_scope(parameter_name) 
0

範圍在Rails的模型參數:

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

或者:

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