Desempenho – Seu argumento é inválido
Quando não há uma razão para preferir um sobre o outro :first
, geralmente será mais rápido do que :last
, porque a última invoca um implícito ORDER
.
Concedido em uma tabela com apenas dezenas de milhares de linhas, não é grande coisa, na ordem de décimos de milissegundos (depois de aquecer meu banco de dados com dezenas de iterações):
[26] pry(main)> User.first.id
User Load (1.4ms) SELECT "users".* FROM "users" LIMIT 1
=> 35811
[27] pry(main)> User.last.id
User Load (1.6ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1
=> 36792
Mas nada disso importa , porque nada pode justificar …
Como explodir em 5 etapas
- Crie um escopo:
class Lead < ActiveRecord::Base
scope :referred_to_pool, -> {
where("leads.state in (?)", ["cold_pool","hot_pool"]) }
end
- Crie um recurso que dependa do escopo e use
last
:
class ReferredLeadsController < ApplicationController
def next_to_assign
@lead = Lead.referred_to_pool.last
end
- Decida que deseja lidar com as atribuições em uma ordem priorizada, então atualize o escopo
scope :referred_to_pool, -> {
where("leads.state in (?)", ["cold_pool","hot_pool"]).
order("referred_at DESC NULLS LAST") }
- Teste se o escopo funciona e pode até ser usado com
first
Lead.referred_to_pool.order("assigned_at DESC NULLS LAST").first
Lead Load (91.1ms) SELECT "leads".* FROM "leads" WHERE (leads.state in ('cold_pool','hot_pool')) ORDER BY referred_at DESC NULLS LAST LIMIT 1
=> #<Lead id:...
- Mas você usou
last
, então, em vez disso, observe seu app explodir:
Lead Load (0.8ms) SELECT "leads".* FROM "leads" WHERE (leads.state in ('cold_pool','hot_pool')) ORDER BY referred_at DESC NULLS LAST DESC LIMIT 1
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "DESC"
LINE 1: ...utfitter_id) ORDER BY referred_at DESC NULLS LAST DESC LIMIT...
^
: SELECT "leads".* FROM "leads" WHERE (leads.state in ('cold_pool','hot_pool')) ORDER BY referred_at DESC NULLS LAST DESC LIMIT 1
from .../activerecord-3.2.21/lib/active_record/connection_adapters/postgresql_adapter.rb:1163:in `async_exec'