wintermeyer
How to do a custom validation of an attribute?
How can I do a custom validation in the following resource to make sure that the attribute use_by_date is today or later but not in the past?
defmodule App.Shop.Product do
use Ash.Resource, data_layer: Ash.DataLayer.Ets
attributes do
uuid_primary_key :id
attribute :name, :string do
allow_nil? false
constraints min_length: 3
end
attribute :price, :decimal
attribute :use_by_date, :date do
allow_nil? false
end
end
actions do
defaults [:create, :read]
end
end
Most Liked
zachdaniel
Creator of Ash
What you’re looking for is validations. I don’t think our built in validations will do datetime comparisons, but you can do it with a custom validation.
validate {MyApp.Validations.InTheFuture, field: :use_by_date}
defmodule MyApp.Validations.InTheFuture do
use Ash.Resource.Validation
def validate(changeset, opts) do
case Ash.Changeset.fetch_argument_or_change(changeset, opts[:field]) do
:error ->
# in this case, they aren't changing the field, or providing an argument by the same name
:ok
{:ok, value} ->
if DateTime.after?(DateTime.utc_now(), value) do
:ok
else
{:error, field: opts[:field], message: "must be in the future"}
end
end
end
end
EDIT: The validations guide is here: Validations — ash v3.29.3
3
zachdaniel
Creator of Ash
So, not sure why the builtin one wouldn’t be working, but you need to be careful with Date.utc_today() like that. That will be referring to the day your app was compiled ![]()
Make sure to use &Date.utc_today/0
2
wintermeyer
For the archive and Google: The code in the resource would look like this.
attributes do
# [...]
attribute :use_by_date, :date do
allow_nil? false
end
end
validations do
validate {App.Validations.InTheFuture, field: :use_by_date}
end
1
Popular in Questions
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
If I have a post route which an argument:
post /my_post_route/:my_param1, MyController.my_post_handler
How would get the post params ...
New
Hi,
I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
What is the idiomatic way of matching for not nil in Elixir?
E.g.,
First way:
defp halt_if_not_signed_in(conn, signed_in_account) when...
New
In templates/appointment/index.html.eex:
<%= for appointment <- @appointments do %>
<tr>
<td><%= appoi...
New
I have followed this StackOverflow post to install the specific version of Erlang.
And When I am running mix ecto.setup then getting fol...
New
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
Using vs code and installed ElixirLS: support and debugger.
And I got an error popped up on start up says
Failed to run ‘elixir’ comma...
New
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
Lets say I have map like this fetching from my database
%{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
Other popular topics
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
Hello everybody,
usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
Using vs code and installed ElixirLS: support and debugger.
And I got an error popped up on start up says
Failed to run ‘elixir’ comma...
New
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
Hello!
Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
Update:
How to use the Blogs & Podcasts section
You can post links to your blog posts or podcasts either in one of the Official Blog...
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
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








