0
什么的ActiveRecord做我写来实现这一目标:活动记录多个选择
SELECT COUNT(*), SUM(`users`.`sign_in_count`), MAX(`users`.`sign_in_count`) FROM `users` WHERE (`users`.`some_field` = 'some_condition')
我怀疑语法是隐约像:
User.where(some_field: some_condition).count.and.sum(:sign_in_count).and.maximum(:sign_in_count)
目前有这样的:
:001:0> User.where(some_field: some_condition).count
(1ms) SELECT COUNT(*) FROM `users` WHERE (`users`.`some_field` = 'some_condition')
=> 10
:002:0> User.where(some_field: some_condition).sum(:sign_in_count)
(1ms) SELECT SUM(`users`.`sign_in_count`) FROM `users` WHERE (`users`.`some_field` = 'some_condition')
=> 100
:003:0> User.where(some_field: some_condition).maximum(:sign_in_count)
(1ms) SELECT MAX(`users`.`sign_in_count`) FROM `users` WHERE (`users`.`some_field` = 'some_condition')
=> 50
ActiveRecord是否能够在一个查询中进行多个选择?我的真实世界用例有点重,并且有多个条件,所以过滤后值得抓取所有结果。我想我能做:
:004:0> all_things = User.select(:sign_in_count).where(some_field: some_condition)
但仍然会做一个呼叫每次当它被称为时间:
:005:0> all_things.count
(1ms) SELECT COUNT(*) FROM `users` WHERE (`users`.`some_field` = 'some_condition')
=> 10
:006:0> all_things.sum(:sign_in_count)
(1ms) SELECT SUM(`users`.`sign_in_count`) FROM `users` WHERE (`users`.`some_field` = 'some_condition')
=> 100
:007:0> all_things.maximum(:sign_in_count)
(1ms) SELECT MAX(`users`.`sign_in_count`) FROM `users` WHERE (`users`.`some_field` = 'some_condition')
=> 50
所以我可以做.to_a
并被迫使用更少的优雅方法
:008:0> all_things = User.select(:sign_in_count).where(some_field: some_condition).to_a
User Load (0.9ms) SELECT `users`.`sign_in_count` FROM `users` WHERE (`users`.`some_field` = 'some_condition')
=> [#<User id: nil, sign_in_count: 0>, ... many elements
:009:0> all_things.count
=> 10
:010:0> all_things.inject(0){|r,e| r+e.sign_in_count}
=> 100
:011:0> all_things.inject(0){|r,e| [r,e.sign_in_count].max}
=> 50
必须有一个漂亮的方式......这不会迫使我填补毫厘行纳秒到内存中,而不是几个结果,或做到这一点:
:012:0> count, sum, max = ActiveRecord::Base.connection.execute("SELECT COUNT(*), SUM(`users`.`sign_in_count`), MAX(`users`.`sign_in_count`) FROM `users` WHERE (`users`.`some_field` = 'some_condition')").to_a.first