前回の続き
続きを読む
Railsの処理の中で、更新するカラムを動的に変えたい場合の書き方。
公式ドキュメント読んでもよくわからなかった(書いてなかった)のでメモ。
user
のhoge
もしくはmoge
のどっちかをfugaに更新したい場合、下記のように書く。
field = user.condition? ? :hoge : :moge user.update(field => 'fuga')
claspのインストールからpushできるようになるまで
公式ドキュメントに沿ってインストールを試みる
sudo npm i @google/clasp -g
するといきなりエラーが出てつまづく
... npm ERR! code ENOENT npm ERR! errno -2 npm ERR! syscall rename npm ERR! enoent ENOENT: no such file or directory, ...
READMEの下の方にトラブルシューティングがあるのでそれを読む。
Node version >= 6.0.0.
とのことなので、トラブルシューティングに沿ってnodeのアップデートをする。
node -v # Check Node version sudo npm install n -g sudo n latest
アップデート後、再度インストールコマンドを実行することでclaspのインストールができた。
clasp -v > 1.7.0
既存のGASプロジェクトと紐付けることもできるみたいだけどまずはclaspでプロジェクトを作成してみる
clasp create
作成するプロジェクトのタイプを選択させられるのでとりあえずstandalone
を選択。
するとまたエラー。
User has not enabled the Apps Script API. Enable it by visiting https://script.google.com/home/usersettings then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
AppsScriptAPIをオンにしろと言われているので指示に従ってhttps://script.google.com/home/usersettingsにアクセスしてAPIをオンにして再度プロジェクトを作成する。
.clasp.json
とappsscript.json
が作成された。
なぜかappsscript.json
のtimezoneが"America/New_York"
になっているがとりあえず気にしないことにする。
この時点で既にGoogleドライブ上にGASプロジェクトは作られているみたい(?)
clasp pull
すると空のmyFunction
が入ったCode.js
がダウンロードされてくる。
とりあえずログを出せるように書いてpushしてみる。
function myFunction() { Logger.log("hoge") }
clasp open
するとブラウザでGASのエディタが開き、ローカルで書いたコードが反映されていることがわかる。
clasp run
してローカルで実行しようとしたら認証スコープ定義しろみたいなエラーが出て実行できなかった。
Error: Local client credentials unauthenticated. Check scopes/authorization.
Logger.logしか書いてないので認証するところないと思うんだけど(ブラウザのGASエディタでは認証ダイアログも開かず問題なく実行できた)
とりあえずES6で適当に書いてpushしたら書いたものがそのまま上がってしまって実行できなかったので(GASはES6記法未対応)何らか変換する部分は自分で用意する必要があるっぽい。
現時点だとローカルでGit管理できるということ以外一切のメリットがないのでもう少し環境整備する必要がある。
とりあえず今日はここまで
Going GAS: From VBA to Google Apps Script (English Edition)
ある日時フィールドstartについて、現在時刻より前かどうかを判定する必要があったが、そのフィールドがnilになる場合がある。
とりあえず正直に書いてみた。
def past? if start.present? start < Time.current else false end end
これでプルリク出したらレビューでstart&.< Time.current
で書けるよと教えてもらった。
これはぼっち演算子と言われるもので「xxx が nil でないときにメソッドyyyを呼び出す」とのこと。
Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 2.5.0)
一応の注意点としてぼっち演算子で書いた場合、startがnilだとstart&.< Time.current
の返り値はfalse
ではなくnil
になる。
しかし、Rubyは「false」と「nil」だけが false
であとは全部 true
なので基本的には問題はなさそう。
冗長なコードが短くなってスッキリ。
def past? start&.< Time.current end
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
classのattrに対して下記のようなpublic_sendで値を設定できるらしい。
public_send("#{attribute_name}=", val)
ということは、obj.hoge=の`hoge=`はメソッドなのか?と思って呟いていたら、attr_*はhoge フィールドとhoge= メソッドを定義するものだと教えてもらえた。(ありがたや〜)
だからpublic_sendで呼び出せるというわけ。
リファレンスにもバッチリ書いてある。
ref.xaio.jp
なるほど〜。
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
ちょっと大量のデータを扱うことになったのでmongoDBのセットアップをした。
当初はGAS+スプレッドシートでササッとやるつもりだったが、調べていくとデータの件数が数十万件を超えることが発覚したのでGASではさばききれない*1ためDBを立てることにした。
mongoDBにしたのは単に以前仕事で使ったことがあるから。
使う人がmacとWindowsと両方いたからDockerで書いた。
mongoDBをDockerで使う方法についてはQiitaに投稿した。
DBはmongoDBに決めたあと、処理するスクリプトはPythonで書くことにした。
ついでにPython3環境もDockerで作るかということでPython3とpymongoが入った環境を作った。
しかしPython自体は問題なく動かせるが、VSCodeでPylintしながら書こうとするとローカルにはpymongo入ってないので常にlintエラーが出続けてしまう。
試せてはいないけど、DockerでPylintのコンテナを立てて検証はそっちにさせればよさそう。
しかしその結果をVSCodeの問題タブに出そうとするとやはり拡張機能作ったりする必要がある気がする。
ひとまずPylintは諦めて書くことにした。
それほど大規模にはならないはずだから多分大丈夫…なはず。
一連のDocker環境はこちら
既存のmodelにカラムを追加するやり方
rails g migration クラス名
クラス名は通常「行なう処理+テーブル名」になる。例えば、AddAgeToUsers(またはadd_age_to_users)となる。
生成されたマイグレーションファイルのchange内にadd_columnを書けばいい。
テーブル名は複数形で書く。
def change
add_column :users, :age, :integer, default: 0, comment: '年齢'
end
add_column - リファレンス - - Railsドキュメント
出来上がったらdb:migrateを実行すればDBやmodelに反映される(modelにもコメントとしてフィールド情報が記載される)
RailsはC#やjavaと違ってmodelにカラムの一覧をフィールドやプロパティで書かないので結構戸惑いますねー。
書き方が悪くてマイグレーションに失敗した場合、一旦下記コマンドをする必要がある*1
rails db:environment:set
その後マイグレーションファイルを直して再度db:migrateを実行する。
*1:詳しい理由はググって