script
I know in elixir data types are immutable. I have a column name failed_login_tries. which is integer and i want to increment it every time user put incorrect password. this is the code
defp check_chromatic_password(plaintext, %User{} = user) do
if Bcrypt.checkpw(plaintext, user.local_password_hash) do
{:ok, user}
else
{:error, :invalid_password}
end
end
failed_login_tries is inside the %User struct
Trending in Questions
Hey guys,
I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly
Do you guys have any suggestions what is the best prac...
New
Hello!
Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app.
I creat...
New
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
Anyone here using Honeybadger?
My Honeybadger account is being overwhelmed with noise from some bots. Seeing a lot of
Bandit.HTTPError...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
Other Trending Topics
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
There are three potential reasons for members of this forum to have a look at https://vutuv.de
You are tired or annoyed of LinkedIn.
Yo...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixir-ls
- #elixirconf-us
- #ai
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
minhajuddin
You can change the user struct by using
user = %{ user | failed_login_tries: user.failed_login_tries + 1}and to persist this in the database useRepo.updateby passing it an updated ecto changeset. Immutability refers to the fact that the previous struct remains the same. e.g.aseigo
Just be aware that there is an inherent race condition with that approach: if the user fails auth in quick succession twice both may have the user record with the current count prior to either auth attempt, and so both will increment the old value by one and update the db with that, causing the N attempts to be counted as just 1!
The correct way to do this is in the database itself using a fragment as in:
This way the db sorts out the concurrent updates and you will always end up with the correct count.
LostKobrakai
There’s an even simpler option to write that query:
aseigo
I always forget about
inc(and friends) .. thanks for the reminder!tjdam
This way of expressing a query, does that mean I can only get this update passing it to an update_all()?
At first I was trying to pass it to a one() since I know I will get only one result, but it doesn’t seem to work.
benwilson512
That’s correct.
silverdr
Is there a “correct” way to update the
timestamps()(:updated_at) when doing this? I mean I know I can addset: [updated_at: ....]to the query and pass the current time but that doesn’t seem “correct”.LostKobrakai
It is though. Updating timestamps is a “schema” feature, which is not supported by the lower level
*_allapi’s on the repo.silverdr
Does it use the “elixir time” or the “database time” for this? If it uses “database time” then I’d need the same to pass to the
set: [updated_at: <here>]. I am not yet the whole codebase savvy enough to quickly find and verify it in the source tree..LostKobrakai
Timestamps use the autogenerate functionality of ecto schema fields, which is runtime functionality. So those are not set on the db.