Skip to content

Repo.set creates new node rather than updating existing node #88

@goravbhootra

Description

@goravbhootra

Expected behaviour: Existing node should be updated

Actual behaviour: New node is created every time

version: 0.5.1

Same implementation was working fine with earlier version.

Implementation:

file lib/lms/courses/course.ex contains:

defmodule Lms.Courses.Course do
  use Dlex.Node
  @derive {Phoenix.Param, key: :uid}

  import Ecto.Changeset

  schema "courses" do
    field(:description, :string)
    field(:duration_allowed, :integer)
    field(:duration_units, :integer, default: 3)
    field(:position, :integer)
    field(:status, :integer)
    field(:title, :string, index: ["term"])
    field(:guidelines, :string)
    field(:guidelines_title, :string)
    field(:has_learning_path, :uid)

    field(:created_at, :datetime)
    field(:updated_at, :datetime)
  end

  @doc false
  def changeset(course, attrs) do
    course
    |> cast(attrs, [
      :title,
      :description,
      :duration_allowed,
      :duration_units,
      :status,
      :position,
      :guidelines,
      :guidelines_title
    ])
  end
end

and lib/lms/courses.ex contains:

def update_course(%Course{} = course, attrs) do
    course
    |> Course.changeset(attrs)
    |> Repo.set()
  end

Following creates a new node rather than updating the existing node:

id = "0x7533" # its a valid id and returns Course struct
course = Repo.get!(id)
course_params = [
  attrs: %{
    "description" => "",
    "duration_allowed" => "",
    "guidelines" => "",
    "guidelines_title" => "",
    "position" => "",
    "status" => "1",
    "title" => "updated title"
  }
]
Lms.Courses.update_course(course, course_params)

Course.changeset(attrs) produces:

changeset: #Ecto.Changeset<
  action: nil,
  changes: %{status: 1, title: "updated title"},
  errors: [],
  data: #Lms.Courses.Course<>,
  valid?: true
>

and data key contains:

%Lms.Courses.Course{
  created_at: nil,
  description: nil,
  duration_allowed: nil,
  duration_units: 3,
  guidelines: nil,
  guidelines_title: nil,
  has_learning_path: nil,
  position: nil,
  status: 1,
  title: "now we got it",
  uid: "0x7533",
  updated_at: nil
}

Tried replacing Repo.set with Repo.mutate but same issue persists.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions