簡體   English   中英

Rails 3.1中的嵌套作用域

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM