Den*_*ton 3 scope named-scope nested ruby-on-rails ruby-on-rails-3
有没有办法可以将以下代码中的to_be_approved方法转换为使用其他两个范围的范围?
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
Run Code Online (Sandbox Code Playgroud)
我也想摆脱reports_to范围内的嵌入式sql,但这是一个完全不同的问题:)
Mic*_*ant 10
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
Run Code Online (Sandbox Code Playgroud)
所有人都要注意.
像这样的链接范围通常在性能上是正确的,因为在示例中调用整个范围链之前不会评估"外部"或"初始"范围(例如scope_name1.scope_name2.scope_name3等,并且仅在实际输出时是否需要构造sql.这被称为"延迟加载",例如"懒惰,在实际需要之前不构建结果".
这与"eager loading"相反,你使用:include语句来获取其他表并"一次性"进行多个查询,并避免臭名昭着的"n + 1"问题,这是程序最终执行的地方(例如)101查询获得100条记录.
很多有趣的信息:)