I’m having trouble understanding the difference between cast_assoc
, assoc_constraint
and foreign_key_constraint
in a changeset. More specifically, I don’t seem to understand when you should build your associations explicitly (by putting foreign keys) versus letting Ecto build them with associations.
I have a schema like this:
schema "institution_codes" do # InstitutionCode
field :code, :string
belongs_to :source, Source
belongs_to :institution, Institution
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:code])
|> cast_assoc, assoc_constraint or foreign_key_constraint?
end
…and in my migration:
create table(:institution_codes) do
add :code, :string
add :source_id, references(:sources)
add :institution_id, references(:institutions)
end
create unique_index(:institution_codes, [:source_id, :institution_id],
name: :institution_codes_index)
If I want to insert a record into institution_codes
, should I be looking up the foreign keys of the Source
and Institution
schema and explicitly putting them in source_id
and institution_id
in my InstitutionCode
schema params then inserting the record, or putting associations?
The unique constraint on InstitutionCode
doesn’t seem to work when putting associations. When I try to insert the record I get errors in my changeset that there are uniqueness violations in the Source
and Institution
schemas because Ecto is trying to insert the associations. I want it to put the keys of the associations as foreign keys in the InstitutionCode
record, not insert the associations themselves.
I feel like I have a fundamental misunderstanding of how these should be used.