2012-08-10 114 views
13

有人可以解釋什麼這種方法做什麼,我可以傳遞給它?範圍和範圍在軌道

scoped(options = nil) 
Returns an anonymous scope. 

還有什麼範圍方法呢?閱讀文檔後我不明白。

回答

30

在ActiveRecord的,所有查詢的建築方法(如whereorderjoinslimit等)返回一個所謂的範圍。只有當您調用像allfirst這樣的踢球者方法時,纔會執行構建的查詢並返回數據庫的結果。

scoped類方法也返回一個作用域。返回的範圍默認爲空,這意味着結果集不會受到任何限制,這意味着如果執行查詢,將返回所有記錄。 您可以使用它來提供一個「空白」選項,例如MurifoX的query_by_date示例。 或者你可以用它來多個條件組合成一個方法調用,例如像:

Model.scoped(:conditions => 'id < 100', :limit => 10, :order => 'title ASC') 

# which would be equivalent to 
Model.where('id < 100').limit(10).order('title ASC') 

scope類方法允許你定義一個類的方法也返回一個範圍,例如像:

class Model 
    scope :colored, lambda {|col| 
    where(:color => col) 
    } 
end 

可以使用這樣的:

Model.colored 

與範圍的好處是,你可以將它們組合起來(幾乎)如你所願,所以下面是絕對有可能的:

Model.red.where('id < 100').order('title ASC').scoped(:limit => 10) 

我也強烈建議通過http://guides.rubyonrails.org/active_record_querying.html

+0

謝謝severin,它幫助。我怎麼知道我可以傳遞給.scoped?我看到:conditions => etc. – LuckyLuke 2012-08-10 12:58:26

+1

您可以在這裏找到所有選項的完整列表:http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find-label-Options – severin 2012-08-10 14:31:36

+0

真棒!感謝您的幫助 – LuckyLuke 2012-08-10 15:35:59

5

我在past.When用它你讓鏈式調用這樣的ActiveRecord查詢接口:

Model.where(:conditions).where(:more_conditions).where(:final_conditions) 

他們每個人已經作用域,使得鏈的工作沒有任何問題。但讓我們假設你有這樣的事情:

Model.query_by_date(date).query_by_user(user).query_by_status(status) 

scope :query_by_date, lambda { |date| 
    case date 
    when "today" 
    where(:date => Date.today) 
    when "tomorrow" 
    where(:date => Date.tomorrow) 
    else 
    # Any value like '' or 0 or Date.whatever 
    end 
} 

如果日期參數不是今天或明天,這會導致錯誤。它會選擇最後一個值,並嘗試將此查詢與下一個query_by_user鏈接起來,從而產生undefined method default_scoped? for ''。但是,如果您在else條件中使用了scoped方法,則它的工作方式沒有任何缺陷,因爲您正在對activerecord說您通過此方法/命名範圍並且未對where/find/other activerecord methods進行任何調用,但返回了一個有作用域的對象,所以你可以繼續鏈接查詢和東西。
最終會是這樣。

else 
    scoped 
end 

希望你明白這個簡單的例子。

+0

讀你能解釋一下這是什麼意思是「作用域」? – LuckyLuke 2012-08-10 12:14:59

+1

這就像「是」ActiveRecord兼容。所有ActiveRecords規範封裝。 – MurifoX 2012-08-10 12:17:16

+0

我不確定我是否理解「範圍」,而不是我理解你的意思......也就是說,我發現否則它就會失敗。但我不明白「範圍」可以做些什麼。 – LuckyLuke 2012-08-10 14:11:59