acrolink
How to set id value in code upon entity creation
I have a special need to set the id of newly created entities to some integer relating to UNIX timestamp (not autoincrement based). Any idea how to do this? i am using Phoenix 1.3. Thank you.
Marked As Solved
voger
Hello. Here is the example repo. https://github.com/voger/custom_id_test
It took me a while to make the pgsql function work
and I didn’t have much time to add controllers or example of custom id using changesets. This example demonstrates how to do it using the database with a sequence as in the link from tomconry. Take a look at the migration.
To use it after you clone it in your computer and do the migrations run iex -S mix and try
iex(1)> alias CustomIdTest.Context
CustomIdTest.Context
iex(2)> Context.create_entry(%{entry: "Reandom text"})
[debug] QUERY OK db=28.5ms queue=0.2ms
INSERT INTO "entry_fragment" ("entry") VALUES ($1) ["Reandom text"]
{:ok,
%CustomIdTest.EntryFragment{__meta__: #Ecto.Schema.Metadata<:loaded, "entry_fragment">,
entry: "Reandom text", id: nil}}
iex(3)> Context.get_entries
[debug] QUERY OK source="entry_fragment" db=4.6ms decode=18.1ms queue=0.2ms
SELECT e0."id", e0."entry" FROM "entry_fragment" AS e0 []
[%CustomIdTest.EntryFragment{__meta__: #Ecto.Schema.Metadata<:loaded, "entry_fragment">,
entry: "random", id: 1616258530136822785},
%CustomIdTest.EntryFragment{__meta__: #Ecto.Schema.Metadata<:loaded, "entry_fragment">,
entry: "random", id: 1616258765361779714},
%CustomIdTest.EntryFragment{__meta__: #Ecto.Schema.Metadata<:loaded, "entry_fragment">,
entry: "Reandom text", id: 1616264079603667971}]
Update:
@acrolink
I added another example on how to set the id from the changeset. This time I used a generator to speed up and you can see the results in a browser. I probably messed up naming and spelling because it was done in a hurry. I hope it doesn’t mind. 
To use it go to http://localhost:4000/things_with_changeset
Especially interesting I believe are [the migration] (https://github.com/voger/custom_id_test/blob/master/priv/repo/migrations/20171002055049_create_things_with_changeset.exs ) and the schema
I modified the controller with this line alias CustomIdTest.CustomIdTest, as: CIT and renamed the relevant function calls. This is irrelevant to the problem at hand. I only did this because I messed up the naming. You don’t have to do this in your controllers.
It is not a well thought example but I hope it helps.
Also Liked
idi527
Sorry, I’ve probably confused you …
The example with defstruct that I’ve provided seems to not be what you want. I just wondered if you were asking about ecto or elixir structs.
Judging by the error you get, you were asking about ecto.
To get custom ids you should use @primary_key.







