Golang にて GORM の First(), Take(), Last() について

GORM

レコードを 1 件だけ取得する時、
GORM は First(), Take(), Last() という 3 つの関数を用意している。
それぞれどういう SQL が発行されるかというと下記になる。

// Get the first record ordered by primary key
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

// Get one record, no specified order
db.Take(&user)
// SELECT * FROM users LIMIT 1;

// Get last record, order by primary key desc
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

気をつけるべきは ORDER BY の部分。
First() と Last() は id でソートしている。
つまり、他のカラムを基準にソートしたい場合は、Take() を使ったほうが良いと思って記事にすることにした。

例えば下記のようにしても挙動的には、同じように取得できる。

db.Order("updated_at").First(&user)

db.Order("updated_at").Take(&user)

db.Order("updated_at").Last(&user)

挙動は同じだけど上記のようなソースコードが混在し始めると可読性が非常に悪くなる。
id でソートする場合は First(), Last() とし、
id 以外のカラムを基準にする時は Take() を使ったほうが、
未来の自分、他の人に対して優しいソースコードになるのではないかと思う。