カクカクしかじか

技術的なアレコレ

Ruby on Rails

Railsの部分テンプレート(partial)内でローカル変数が存在するか判定する方法

概要 複数のメールテンプレート内で読み込まれる部分テンプレート(partial)の内部に、一部のテンプレートから呼ばれる時だけ locals: { requested_date: @requested_date } のように渡されるローカル変数を定義すると、別の箇所ではその値を渡さないで呼び出…

ActiveHashってscope使えるのか...

概要 ActiveHashでもscopeが使えるの知らんかった... そういう話です🙈 例 class Band < ActiveHash::Base self.data = [ { name: 'Nirvana', category:'Grunge' }, { name: 'Dinosaur Jr.', category:'Grunge' }, { name: 'Sonic Youth', category:'Grunge' }…

ActiveSupport::Testing::TimeHelpersのfreeze_time知らなかった...

元記事 techracho.bpsinc.jp 所感 今までは同じく ActiveSupport::Testing::TimeHelpers の travel_to などを使用していました😇 もっと早く知りたかった... 使っていこう💪 before { freeze_time }

特定のクラスを継承したファイルの一覧をRubyのスクリプトから出す方法

掲題のやりたいことを実現するスクリプト ※descendantsメソッドはActiveSupportのメソッド descendantsメソッドは、そのレシーバより下位にあるすべてのクラスを返します。 Active Support コア拡張機能 - Railsガイド # Load Dir.glob('app/mailers/**/*.rb…

Railsアプリで特定のURLへのアクセスを指定したURLへリダイレクトさせるためのroutes.rbの定義

はじめに routes.rbに直接redirect先を定義出来るの知らんかった... 用途と書き方 get '/blogs/:id' => redirect("別のパス") 出来ること get '/blogs/:id' などの :id の部分は %{id} で利用可能 get '/hoge/:user_name' => redirect("https://%{user_name}…

mongoidでパラメーターがtrue/falseであるに関わらずセットされているかで条件分岐したい場合

今回の問題 フラグを検索条件に含めていて、値がセットされていればfalse/trueに関わらず、検索条件に含めたいときに present? で判定してしまうと false が検索フラグに設定されていた場合に値がセットされているにも関わらず if文で false と判定されてし…

Railsで文字列をBooleanにキャストする方法

やり方 ActiveRecord::Type::Boolean.new.cast(キャストしたい値) を使う! # 文字列の'true'や'false'の場合 $ ActiveRecord::Type::Boolean.new.cast( 'true') => true ActiveRecord::Type::Boolean.new.cast('false') => false # 整数の場合 $ ActiveReco…

mongoidのindexの貼り方まとめ

はじめに mongoidでのindexの貼り方のアレコレをまとめてくれている記事がないので自分のためにまとめます。 通常のindex 自身のフィールドに対するindex ※ background: true は更新時のロックが掛からないようにするオプション index({特定のフィールド: 1,…

OSSにプルリクエストを送る際の注意点と備忘録

概要 oneshot_task_generatorというgemにプルリクエストを送りました github.com 本稿はその際についうっかりやらかした部分とどうすると良いのか?を自分なりにメモした記録になります。 oneshot_task_generatorについて その場限りのスクリプトをrakeタス…

gem内部のクラス名とアプリケーション内のクラス名が衝突した際の名前付けの教訓

経緯 とある機能の改修で連携先のシステムが公式に提供しているgemを使わねばならず、そのgemを追加したところ変なところでテストが落ちるようになりました そのgemを追加したことが原因であることは明白だったのですが、どこが悪さをしているかの全くわから…

mongoidのアソシエーションの依存オプション

:delete モデルのコールバックを実行せずに子ドキュメントを削除する。 :destroy 子ドキュメントを破棄し、モデルコールバックを実行します。 :nullify 子ドキュメントの外部キーをnilで更新して子ドキュメントを孤立させる。 :restrict 子ドキュメントが存…

Railsアプリの開発環境でminioをDockerで動かす方法

minioって何? S3互換のストレージサービスです。 実際にやっていく💪 手順1. docker-compose.ymlの定義 とりあえず、docker-compose.ymlにminioを定義します。 docker-compose.yml version: '2' services: <省略> minio: container_name: minio hostname: min…

Railsアプリ上で文字列をクラス定数に変換する方法

経緯 異なるクラスであるものの、同じ形式のクラスメソッド呼び出しを共通化したいというケースに直面し、調べることに! # やりたいこと 特定のクラス名.クラスメソッド やり方 小文字の文字列をクラス名の形式にするために classify しても、その結果はま…

ActiveHashのデータに対してSet型の値で検索を行う場合の注意点

検証環境 Rails 5.1.7 Ruby 2.5.7 結論 Set型の値をto_aで配列に戻してあげないと、配列として解釈してはくれない模様.. # 都道府県モデル class Prefecture < ActiveHash::Base field :name field :english add id: 1, name: 'ほげ県', english: "Hoge" <中…

bundle outdatedコマンド

bundle outdatedコマンド 現在のアプリディレクトリのgemに更新がないかをチェックしてくれるコマンドらしいです!(今日知ったw) RailsやGemのバージョンアップ対応などで、地味に助かりそうな機能だなという感想でした(小並感...) 実際にコマンドを打ってみ…

webpackerでCSSのコンパイルがうまくいかない場合の解決法

発生事象 webpackerのgemのバージョンを上げて本番リリースした際に不具合が発生し、revertしてgemのバージョンを戻したところローカルではそれまで正常にコンパイルされてたCSSが正常にコンパイルされなくなってしまいました... なお、エラー文言をメモしそ…

ActiveRecordでのあいまい検索(mongoidと比べた)

経緯 久々にActiveRecordを業務でいじることになり、あいまい検索の方法を忘れてたのでメモ。 ちなみにmongoidだとこんな感じで正規表現的に書ける。 Model.where(name: /hoge/).to_a 書き方 mongoidに慣れすぎててパッと分かんなかった... key = "Supreme" …

RailsでActiveRecord::Enumを使わずにそれっぽい機能を実装する方法

経緯 普段の業務でmongoidというActiveRecordとは異なるORM(正確にはODM)を使っています。 当たり前ですが、ActiveRecordを使用しないRailsアプリではActiveRecordの使用を前提としたRailsの機能を使用することが出来ません。 というわけで、ActiveRecord::E…

CircleCI上でPG::ConnectionBad: could not traslate host name "db" to address: Name or service not knownが起こった時に確認したこと

発生した事象 CircleCI上でRSpecを実行するための前準備として bundle exec rails db:create を行う場面で PG::ConnectionBad のエラーが発生してしまっていました。 結論 database.ymlとconfig.ymlの設定内容を確認しましょう。 今回の場合で言うとdatabase…

mongoidで値がセットされて変更されるフィールド値(save前)をコンソールで確認する方法

やり方 公式ドキュメントによるとこんな感じの書き方でフィールドの値の変更をコンソールで確認出来るみたいです。 user.name = "hoge" => "hoge" user.changed_attributes => {"name"=>"hoge"} saveされると消えるっぽい。 user.save user.changed_attribut…

mongoidのor条件クエリany_of

基本構文 そういえばmongoidでOR条件どうやるんだっけ? そんな私の今日のメモ Model.any_of({フィールド: 条件}, {フィールド: 条件}) 使用例 良い例が思い付かなかった... # クーポンが適用されていない or クーポンの期限が切れていない Coupon.any_of({a…

定期的にbundle cleanupをしたいね

このコマンド知らんかった... bundle cleanup というコマンドを打つとローカルのbundle install先の使われていないGemを綺麗に削除してくれるそうな... Deploy用の踏み台サーバーで無駄にディスク容量を食ってそうなゴミファイルの掃除をした際に知りました.…

mongoidのModel.where(field: { '$exists' => true }はフィールドが存在したら無条件で値を取ってきてしまうのでnilチェックされないという落とし穴

前提 BlogモデルとUserモデルがある BlogはUserにbelogs_toの関係 Blogのデータに対してUserが存在するデータだけを検索したい場合 落とし穴 mongoidの Blog.where(user: { '$exists' => true } は フィールドが存在したら無条件で値を取ってきてしまうので…

Railsで作られるファイルのデフォルトコメントを何も考えずに削除する習慣はやめとけ!

今回の結論 Railsのgemに用意されたコマンドからジェネレートされるファイルのデフォルトで書かれている英文のコメントは何も考えずに削除しない方が幸せになれますよ!という話です。 もっと詳しく 例えば、RSpecの初期ファイルにはRSpecの仕様に関する重要…

bundle installでAn error occurred while installing nokogiri (1.9.1)になった場合の解決法

nokogiriのインストールで死ぬ問題 とあるアプリでbundle installしようとしたところ... $ bundle install --path vendor/bundle <中略> Fetching nokogiri 1.9.1 Installing nokogiri 1.9.1 with native extensions Gem::Ext::BuildError: ERROR: Failed to…

Dockerのミドルウェア(DB)のバージョンを上げた時にデータベースに接続出来なくなる場合の雑な解決法

前提 Docker for Macを使用している RailsアプリのミドルウェアだけをDocker化している /provisioningディレクトリを作り、そこにdocker-compose.ymlを配置している dockerコマンドはdocker-compose.ymlを配置したディレクトリで実行 概要 Dockerを使って起…

mongoidのupdate_allにバグがあるかもしれない?

gemのバージョン mongoid 6.1.1 MongoDBのバージョン Docker使用 mongo:3.6.12 概要 一対多のモデルに対する update_all が正しく動いてなさそう... 雑な例 (実際のコードとは関係ありません) Orderモデルにpending(入金待ち)、complete(決済完了)とcancel(…

brew updateの影響でreadlineに依存してるgemとtigが壊れた場合の解決法

発生エラー brewで最新のmondodbをインストールするために brew update を行った後 rails console を実行したら今回のエラーが発生しました。 $ bundle exec rails c /Users/shigeyukifukuda/.rbenv/versions/2.3.8/lib/ruby/2.3.0/irb/completion.rb:10:in …

mongoidのtimeless.save関連のバグを見つけた備忘録

概要 mongoidには特定のインスタンスのtimestampを更新したくない時に、timestampだけ更新しないようにする仕組みがあります。 私は実務でActive Recordを使ったことがないので定かではないですが、Active Recordにも必ずあるはずです。 そのオプションを付…

MongoDBのODマッパーmongoidにプルリクエストを送ってみた

今回やったこと RailsからMongoDBを使うためのOD(Object Document)マッパーであるmongoidにプルリクエストを送りました。 github.com 概要 mongoidを使った時にrails g modelコマンドでデフォルトで生成されるファイルにはtimestampがincludeされないので、…