ash/documentation/topics/resources/attributes.md
Zach Daniel e91da15564 docs: moved around some documentation
docs: added changes guide
docs: moved around validations guide, removed extra one
2024-04-08 12:05:36 -04:00

2.6 KiB

Attributes

Attributes specify the name, type and additional configuration of a simple property of a record. When using SQL data layers, for example, an attribute would correspond to a column in a database table. For information on types, see Ash.Type.

To see all of the options available when building attributes, see d:Ash.Resource.Dsl.attributes.attribute

If you are looking to compute values on demand, see the Calculations guide and the aggregates guide.

Special attributes

In Ash there are 4 special attributes these are:

  • create_timestamp
  • update_timestamp
  • integer_primary_key
  • uuid_primary_key

These are really just shorthand for an attribute with specific options set. They're outlined below.

create_timestamp

You may recognise this if you have used Ecto before. This attribute will record the time at which each row is created, by default it uses DateTime.utc_now/1.

create_timestamp :inserted_at is equivalent to an attribute with these options:

attribute :inserted_at, :utc_datetime_usec do
  writable? false
  default &DateTime.utc_now/0
  match_other_defaults? true
  allow_nil? false
end

update_timestamp

This is also similar in Ecto. This attribute records the last time a row was updated, also using DateTime.utc_now/1 by default.

update_timestamp :updated_at is equivalent to:

attribute :updated_at, :utc_datetime_usec do
  writable? false
  default &DateTime.utc_now/0
  update_default &DateTime.utc_now/0
  match_other_defaults? true
  allow_nil? false
end

uuid_primary_key

This attribute is used in almost every resource. It generates a UUID every time a new record is made. uuid_primary_key :id is equivalent to:

attribute :id, :uuid do
  writable? false
  default &Ash.UUID.generate/0
  primary_key? true
  allow_nil? false
end

integer_primary_key

Creates a generated integer primary key. Keep in mind that not all data layers support auto incrementing ids, but for SQL data layers this is a very common practice. For those that don't, it is your own job to provide values for the primary key. We generally suggest using UUIDs over integers, as there are a lot of good reasons to not use autoincrementing integer ids.

integer_primary_key :id is equivalent to:

attribute :id, :integer do
  writable? false
  generated? true
  primary_key? true
  allow_nil? false
end