Ano, toto ověření by provedlo tento druh dotazu a tento druh dotazu provede skenování tabulky.
Ve skutečnosti zde máte několik problémů:
- Ověření podléhá podmínkám závodu, protože logika není v databázi, kam patří. Databáze by měla být zodpovědná za všechny problémy integrity dat bez ohledu na obvyklou ideologii Rails.
- Vaše ověření spouští prohledávání tabulek a nikdo nemá rád prohledávání tabulek.
Oba tyto problémy můžete vyřešit jedním indexem. První problém je vyřešen použitím jedinečného indexu uvnitř databáze. Druhý problém je vyřešen indexováním výsledku lower(username)
spíše než username
.
AFAIK Rails stále nerozumí indexům výrazů, takže budete muset udělat dvě věci:
-
Přepněte z
schema.rb
nastructure.sql
aby Rails nezapomněl na váš index. Ve vašemconfig/application.rb
budete chtít nastavit:config.active_record.schema_format = :sql
Budete také muset začít používat
db:structure:*
úlohy rake namístodb:schema:*
úkoly. Jakmile přepnete nastructure.sql
, můžete odstranitdb/schema.rb
protože již nebude aktualizován ani používán; budete také chtít začít sledovatdb/structure.sql
v kontrole revizí. -
Vytvořte index ručně napsáním části SQL při migraci. Je to snadné:
def up connection.execute(%q{ create index idx_users_lower_username on users(lower(username)) }) end def down connection.execute(%q{ drop index idx_users_lower_username }) end
Samozřejmě vám to umožní věci specifické pro PostgreSQL, ale to není důvod k obavám, protože ActiveRecord vám stejně neposkytuje žádnou užitečnou přenositelnost.