Rails で使い捨てコードを書く場合の超小技

結論

tmp/ 配下に書き、rails consolerails runner で実行する。

理由

  • コミットに紛れ込む可能性を排除したいから
  • 使い捨てであることが明確になるから
  • 拡張子付きで「保存」することで、シンタックスハイライトなどを使うことができるから
  • irb(pry) で実行するのが大変な長めのコードも気軽に扱えるから
    • ただし、irb(pry)と違い、戻り値の表示はありません
      • 途中に binding.pry を挟めばそこで止められます

注意点

使い捨てだけど複数の人で使いまわしたい*1は、コミットされないので注意です。

補足

  • Active Record など、Rails の機能は当該コード内で使うことができます
  • 結構当たり前のことかもしれないです

*1:それを「使い捨て」というのかは大変微妙ですが……

GitHub Actions にて Rails で PostgreSQL を使おうとした際に PostgeSQL に接続できなくてハマった話

注意

2022/06/18(土)時点で以下の情報が正しいかどうかは確信が持てません。

前提

  • GitHub Actions であることや Rails であることは本質的には関係ありません

結論(注意するところ)

services 配下の postgres において、env で指定する環境変数の「キー」は予約語(決められた語)であること

  • POSTGRES_USERPOSTGRES_PASSWORD です
  • これは当該コンテナがそうなっているからです
    • コンテナによって命名は異なるので、ドキュメントの確認は必須です
  • データベースを使う全ての step において、それぞれにホストを設定する必要があります

具体的にこの部分は下記のような YAML になります。

    services:
      postgres:
        image: postgres:11.2
        ports:
          - 5432:5432
        env:
          POSTGRES_USER: WATASHI_NO_NAMAE
          POSTGRES_PASSWORD: WATASHI_NO_PASSWORD
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5

db:migratedb:seed などで PostgreSQL に接続する際には、 ホストとして postgres という予約語(決められた語)を指定すること

  • localhost ではなく postgres です
    • これも当該コンテナのホスト名の仕様によります

具体的にこの部分は下記のような YAML になります。

    - name: $ bundle exec rails db:migrate を行う
      run: |
        bundle exec rails db:migrate
      env:
        PG_HOST: postgres
        RAILS_ENV: test

上記の指定語以外は config/database.yml に従う

これまでに書いた内容は指定語です。それ以外の語の命名は自由ですが、上記の指定語と整合性をもたせて書く必要があります。config/database.yml に丁寧に書きます。

感想

地味にハマりました……。

Twitter の gem を用いた際にツイートのオブジェクトをシリアライズしてそのまま保存する

前提

以下のコードにおいて tweetTwitter::Tweet クラスのオブジェクトであるとします。

結論

tweet に対して to_json メソッドを用います。結果として得られる値は JSON の文字列なので、データベースにそのまま保存できます*1

serialized_tweet_object = tweet.to_json

上記の serialized_tweet_object をオブジェクト(Twitter::Tweet クラスのオブジェクト)に戻すためには 、Twitter::Tweet クラスのオブジェクトを作成する際に、コンストラクタの引数として元々のハッシュを渡せばよいです。

元々のハッシュとは、serialized_tweet_object を JSON からハッシュに変換したものです。一点注意することは、ハッシュのキーはシンボルでなければいけないということです。したがって、JSONJ.parse の引数に symbolize_names: true を付与することを忘れないようにします。

たとえば、以下のようになります。

original_tweet_object = Twitter::Tweet.new(JSON.parse(serialized_tweet_object, symbolize_names: true))

これで、original_tweet_objectTwitter::Tweet クラスの各種 API を用いることができるように復元できました。

*1:JSON型にするかどうかというのは議論があるところです

続きを読む

PostgreSQL にて postgres というユーザのパスワードが分からなくなっても sudo できれば助かる

結論

pg_hba.conf において、postgres ユーザの認証方式を trust にすれば、パスワードがなくてもログインできます。pg_hba.conf を編集するには sudo できればよいです*1

補足

当たり前のことですが、trust にする場合は適用範囲や適用アカウントを絞るなどしてリスクとならないように注意が必要です。

*1:編集後は PostgreSQL の再起動を忘れずに

Powered by はてなブログ