Search documentation of ash

# View Source 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 `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

← Previous Page Domains
Next Page → Relationships