Rails で datetime型 にテキストをそのまま入れる形で find_or_initialize_by でレコード操作したらタイムゾーンが異なっていたためすべて新規レコードになってしまった

前提

find_or_initialize_by にこだわるのは本質的ではなく、find_bywhere などでも同じです。本質はタイムゾーンの違いです。

結論

具体例を見たほうが早いと思いますので、載せます。

NG な例

user = User.find_or_initialize_by(
  name: 'hoge',
  submitted_at: '2023/04/07 17:48:31'
)

これを繰り返し実行した場合に、常に user.new_record?true を返してしまいます。

OK な例

期待通りの動作をさせるためには、テキストでそのまま入れるのではなく Time.zone.parse します。

ただし、データソースによってはタイムゾーンには注意が必要ですこちらなどを参照)。

user = User.find_or_initialize_by(
  name: 'hoge',
  submitted_at: Time.zone.parse('2023/04/07 17:48:31')
)

これで find でちゃんと見つけてきてくれます。

検討

SQL を見てみるとよく分かります*1

NG な例

User.find_by(submitted_at: "2023/04/07 17:48:31")
#=> SELECT "users".* FROM "users" WHERE "users"."submitted_at" = $1 LIMIT $2  [["submitted_at", "2023-04-07 17:48:31"], ["LIMIT", 1]]

OK な例

User.find_by(submitted_at: Time.zone.parse("2023/04/07 17:48:31"))
#=> SELECT "users".* FROM "users" WHERE "users"."submitted_at" = $1 LIMIT $2  [["submitted_at", "2023-04-07 08:48:31"], ["LIMIT", 1]]

*1:PostgreSQL を使用しています

WSL2 で Tailscale (tailscaled) を自動で起動する方法

結論

シェルの設定ファイルに例えば以下のように組み込む。

# Starting Tailscale daemon automatically if not running...
RUNNING=`ps aux | grep tailscaled | grep -v grep`
if [ -z "$RUNNING" ]; then
    sudo tailscaled > /dev/null 2>&1 &
    disown
fi

補足

  • $ sudo tailscaled をパスワード確認無しで実行するために /etc/sudoers に追記をする必要がある*1
    • tailscaled の場所は which tailscaled で調べる
  • これ以外の方法もあり得るが(次項の「参考」を参照)、この方法はシンプルだしシェル起動時間にもそんなに影響がないため、これがベターだと思う
  • 他の「スタートアップ時起動」したいアプリケーションもこの累計で起動できる*2

参考

github.com

*1:もちろん visudo 経由で

*2:少々強引な方法ではあるが

Activerecord-Import で大量のデータをバルクインポートしようとすると PostgreSQL が落ちる

Activerecord-Import とは

github.com

結論(どうするか)

インポート時に batch_size オプションを指定してやる。

具体例

User.import!(users, batch_size: 10000)

PostgreSQL が落ちたときのエラーメッセージ

PQconsumeInput() SSL SYSCALL error: EOF detected (ActiveRecord::ConnectionFailed)

参考

https://webcache.googleusercontent.com/search?q=cache:jdX4uXcvCb4J:https://system.blog.uuum.jp/entry/2022/10/11/131234&hl=ja&gl=jpwebcache.googleusercontent.com

Powered by はてなブログ