Ecto: как вводить данные в набор изменений без Model.Callbacks

Ecto.Model.Callbacks теперь устарели.

Я пытаюсь добиться того же поведения, что и before_insert, но безрезультатно! Я даже не могу заставить что-либо вызвать IO.puts("hello") внутри моего changeset/2.

Вот что у меня есть:

def changeset(model, params \\ :empty) do
    IO.puts "HELLO" # never prints
    model
    |> cast(params, @required_fields, @optional_fields)
    |> put_change(:column_name, "hello")
end

Вместо put_change я пробовал подставлять change, cast и практически все остальное внутри Ecto.Changeset.

Я также пробовал метод без трубопровода, на всякий случай:

chset = cast(model, params, @required_fields, @optional_fields)
put_change(chset, :column_name, "hello")

Конечной целью является смещение inserted_at строки на новое значение, поэтому простого default: "hello" на схеме будет недостаточно.

Большое спасибо!


person lukeed    schedule 19.05.2016    source источник
comment
Вы явно вызываете YourModel.changeset из своего кода?   -  person Dogbert    schedule 19.05.2016
comment
Вы пытались добавить пользовательскую функцию в конвейер набора изменений, которая возвращает набор изменений с вашими изменениями, примененными к нему?   -  person coderVishal    schedule 20.05.2016


Ответы (1)


В итоге я решил это с помощью фрагмента Postgres.

Это не совсем то, что я искал, поэтому я оставлю этот вопрос открытым для тех, у кого есть ответ, связанный с changset, потому что это все еще абсолютно ничего не дает мне.

Вот мое временное решение, связанное с файлом миграции postgres.

create table(:stuffs) do
    add :expires_at, :datetime, default: fragment("now() + interval '60 days'")
end
person lukeed    schedule 19.05.2016