sql >> Databáze >  >> RDS >> Mysql

Rails "kam" po dobu kratší než dotazy

Upravit 2. 9. 5. 20

Pokud používáte Ruby 2.6, můžete to udělat s nekonečnými rozsahy a v Ruby 2.7 můžete používat rozsahy bez začátku.

Např.:

# Ruby >= 2.6
User.where(last_deposit: 10.days.ago..)

generuje

SELECT "users".* FROM "users" WHERE "user"."last_deposit" >= '2020-04-29 21:58:39.109419'"

a

# Ruby >= 2.7
User.where(last_deposit: ..10.days.ago)

generuje

SELECT "users".* FROM "users" WHERE "users"."last_deposit" <= '2020-04-29 22:01:05.582055'

Upravit

To je nyní možné v Rails 5!

User.where(last_deposit: 10.days.ago..DateTime::Infinity.new)

vygeneruje SQL

SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2018-06-30 17:08:54.130085').

Původní (a kolejnice <5) odpověď

Nezdá se, že by existoval způsob, jak použít základní where hash syntaxe pro generování dotazu větší než nebo menší než pro časová razítka. Nejjednodušší a nejčitelnější způsob je popsán v mé otázce pod Current Simple Solution .

Dalším způsobem, jak to udělat, je použití ARel, ale musíte provést některé méně často vídané hovory. Nejprve můžete získat popisovač tabulky ARel třídy AR, vstoupit do sloupce a předat výsledek větší než gt , větší nebo rovno gteq , méně než lt a/nebo menší nebo rovno lteq metoda s argumentem where .

Ve výše uvedené situaci by to bylo provedeno takto:

last_deposit_column = User.arel_table[:last_deposit]
last_deposit_over_ten_days_ago = last_deposit_column.gteq(10.days.ago)
User.where(last_deposit_over_ten_days_ago)


  1. SQL Server TempDB Monitoring pomocí Dynamic Management Views (DMV)

  2. jaký má smysl serializovat pole pro jejich uložení do db?

  3. Řešení problémů generátoru číselných řad – Část 5

  4. Obchodní logika:Databázová nebo aplikační vrstva