LoginSignup
3
1

More than 5 years have passed since last update.

Ectoでupdated_atだけを更新する方法

Last updated at Posted at 2018-06-26

Ectoではテーブル定義でtimestampsを記述すると、追加日時inserted_atと更新日時updated_atが追加されます。

create table(:users) do
  add :name, :string, null: false
  timestamps()
end

updated_atは、下記のようにレコードを更新したときに自動的に更新されます。
Railsを使っている人にもお馴染みでしょう。

user = Repo.get(User, 1)
Repo.update(User.changeset(user, %{name: "hoge"}))

時にはupdated_atだけを更新したいことがあります。
しかし、次のコードでは更新が走らず、updated_atも更新されません。

user = Repo.get(User, 1)
Repo.update(User.changeset(user))

Railsの場合は、touchを使いますが(参考: Railsでupdated_atのみ更新したい場合)、 Ectoではforceオプションを使って、強制的に更新を走らせます。

user = Repo.get(User, 1)
Repo.update(User.changeset(user), force: true)

HexDocsにも、きちんと説明が書いてあります。

By default, if there are no changes in the changeset, update/2 is a no-op. By setting this option to true, update callbacks will always be executed, even if there are no changes (including timestamps).

デフォルトでは、changesetに変更がない場合にはupdate/2は何もしない。このオプション(force)をtrueに設定することで、(timestampsで作られたカラムも含めて)changesetに変更がなくてもupdateコールバックは常に実行されるようになる。

また、Google Groupでは、Elixirの生みの親であるJose氏がHow to update updated_at onlyという質問に答えています。

You can pass a force: true option when you call Repo.update with an empty changeset

force: trueオプションを渡してRepo.updateを呼び出せば良い

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1