user974881
DETS keypos option to store a struct
Hello,
I’m trying to use DETS to store a struct, so I know that for this, I need to use the keypos option to tell elixir where it should get the key, so it’s value would be #struct.key, but in elixir, I don’t know how to do it.
I have tried :key, %Struct.key, %Struct[}.key, #struct.key and also without keypos, but none have worked.
How do I use DETS to store a struct? I have also checked in Elixir’s source code and documentation but haven’t found it, I guess this is because it comes from erlang.
Marked As Solved
al2o3cr
The #record.key syntax is for records; Elixir structs are not records, they are maps.
DETS stores tuples, so records fit naturally.
You’ll need to either produce a tuple from your struct, so that %SomeStruct{key: 123} is stored as {123, %SomeStruct{key: 123}} or transform the struct to a record (see the Record docs for some Elixir helpers).
One possible gotcha: for the “convert to a record” case, I don’t see a clear Elixir equivalent to #record.key to get a tuple position from a field name ![]()
Edit: thanks to @lud for calling out what I totally skimmed past - if you said defrecord :user, ... then user(:some_field) is the zero-based index of some_field in the record. That will work as-is if you want to access the field with Kernel#elem, but you’ll need to explicitly add one if you pass it to ETS as keypos (which expects a 1-based index!).







