有人可以解釋什麼這種方法做什麼,我可以傳遞給它?範圍和範圍在軌道
scoped(options = nil)
Returns an anonymous scope.
還有什麼範圍方法呢?閱讀文檔後我不明白。
有人可以解釋什麼這種方法做什麼,我可以傳遞給它?範圍和範圍在軌道
scoped(options = nil)
Returns an anonymous scope.
還有什麼範圍方法呢?閱讀文檔後我不明白。
在ActiveRecord的,所有查詢的建築方法(如where
,order
,joins
,limit
等)返回一個所謂的範圍。只有當您調用像all
或first
這樣的踢球者方法時,纔會執行構建的查詢並返回數據庫的結果。
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
我在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
希望你明白這個簡單的例子。
謝謝severin,它幫助。我怎麼知道我可以傳遞給.scoped?我看到:conditions => etc. – LuckyLuke 2012-08-10 12:58:26
您可以在這裏找到所有選項的完整列表:http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find-label-Options – severin 2012-08-10 14:31:36
真棒!感謝您的幫助 – LuckyLuke 2012-08-10 15:35:59