[英]Nested scopes in Rails 3.1
有沒有一種方法可以將下面代碼中的to_be_approved by方法轉換為使用其他兩個范圍的范圍?
scope :reports_to, lambda { |manager|
joins(" JOIN admin_users request_user on requests.admin_user_id = request_user.id and request_user.manager_id = #{manager.id} ") }
scope :pending, joins(:admin_request_status).where('admin_request_statuses.name = ?','Pending Approval')
def self.to_be_approved_by( manager )
reports_to(manager).pending
end
我也想擺脫reports_to范圍內的嵌入式sql,但這是一個完全不同的問題:)
scope :reports_to, lambda { |manager| joins(:admin_user).where('admin_users.manager_id = ?',manager.id) }
scope :pending, joins(:admin_request_status).where('admin_request_statuses.name = ?','Pending Approval')
scope :to_be_approved_by, lambda { |manager| self.pending.reports_to(manager) }
end
注意所有。
像這樣的作用域通常在性能上是可以的,因為在示例中調用完整的作用域鏈之前(例如,scope_name1.scope_name2.scope_name3等),並且僅當實際輸出時,才會評估“外部”或“初始”作用域將需要構造sql。這就是所謂的“延遲加載” ,例如“懶惰,直到實際需要時才生成結果”。
這與“急於加載”相反,在這種情況下,您可以使用:include語句“一次性”獲取其他表並進行多個查詢,從而避免臭名昭著的“ n + 1”問題,該問題最終會在程序中執行(例如)101條查詢,以獲得100條記錄。
很多有趣的信息:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.