Ash FrameworkAF
Ash Framework3y ago
9 replies
Ben RMX

Does attribute and action order matter? and Upsert fields?

Given Declaration
defmodule MyApp.MyContext.Event do
  use Ash.Resource, data_layer: AshPostgres.DataLayer

  postgres do
    table "event"
    repo MyApp.MyContext.Repo
  end
  
  multitenancy do
    strategy :attribute
    attribute :organization_id
  end

  attributes do
    # Tenancy, Identity and Immutability
    # * Primary Key - [:organization_id, :id]
    # * need to manually declare id so we do not autogenerate UUID
    attribute :organization_id, :uuid, allow_nil?: false, primary_key?: true
    attribute :id, :uuid, allow_nil?: false, primary_key?: true

    attribute :data, :map
    attribute :dataschema, :string
    
    attribute :partitionkey, :string
    attribute :sequence, :integer
    attribute :source, :string, allow_nil?: false
    attribute :subject, :string
    attribute :time, :utc_datetime_usec
    attribute :type, :string, allow_nil?: false

    create_timestamp :created_at
  end

  identities do
    identity :id, [:id]
  end

  actions do
    defaults [:read]
    create :add do
      upsert? true
      upsert_identity :id
      upsert_fields([:id])
    end
  end
end


The above gives me the warning:
warning: the Inspect protocol has already been consolidated, an implementation for Btwb.Koohbew.Event has no effect. If you want to implement protocols after compilation or during tests, check the "Consolidation" section in the Protocol module documentation

But if I move identities and actions to above the attributes, then no warning...

Given:
MyApp.MyContext.Event |>
  Ash.Changeset.for_create(
    :add,
    %{
      organization_id: "1c8345b3-f484-47a7-ad21-da17fa511966",
      id: "a325ac4a-5c7b-11ee-8c99-0242ac120002",
      type: "namtest2",
      source: "MyEventSource.34293942394234"
    })
  |> Ash.Changeset.set_tenant("1c8345b3-f484-47a7-ad21-da17fa511966")
  |> MyApp.MyContext.create()


The above gives a SQL query with DO UPDATE SET on all fields

Am I doing something wrong? Do actions have to be above attributes?
Was this page helpful?