あんパン

こしあん派

別ブランチの特定のファイルをvimで開く

$ git show branch_name:/path/to/file

すると別のブランチのファイルを標準出力にだすことができる(知らなかった).

$ git show branch_name:/path/to/file | vim -

するとVimで開けて便利.lessとかに出すのも良さそう.branch_nameはコミットのハッシュでもOK.

消したファイルとかいちいちGitHubに見に行かなくて済むようになった.

UMLシーケンス図を手軽に書いてTeXに貼る

卒論でUMLのシーケンス図をTeXに貼る必要が生まれた.Illustratorとかでちまちま描いても良いのだけど,面倒なのでテキストでなんとかしたい.

便利なツールあって,これ使うとテキストでシーケンス図を描くことができる.

js-sequence-diagrams by bramp

SVGでダウンロードできるのだけど,このままだと使い勝手が悪いのでpdfに変換する.pdfにしてしまえばあとはpngみたいにxbb作ったりするだけでTeXに貼れる.

pdfに変換するにはInkscapeを使えば良い.Macならhomebrew caskで入れられる.最近cask新しくなったらしくてよくわからないけど,古いやつならbrew cask install inkscapeとかで入って便利.

/Applications/Inkscape.app/Contents/Resources/bin/inkscape -f /path/to/source.svg -A /path/to/dst.pdf -w 1000

このコマンドでsvgをpdfに変換できる.アプリケーションのパスは適宜変更のこと.svgとpdfのパスは絶対パスにしないとうまくいかないかもしれない.$HOME/Downloads/diagram.svgみたいな感じで指定するとよさそう.

シーケンス図に日本語入ってると中華フォントになって困る.テキストエディタでダウンロードしたsvgを開いてfont-familyのAndale MonoってところをHiragino Kaku Gothic ProN W3とかに変えてからInkscapeで変換するとうまくいく.

ヒラギノ入ってない環境なら雑にメイリオとか指定するとなんとかなりそう.

これでちまちま図を描かなくて良くなって最高.

ActiveRecordでSTIとrelationを組み合わせる

Rails(ActiveRecord)にはSTI(単一継承テーブル)があって,テーブルは1つだけどtypeというカラムでモデルを出し分けることができる.例えば,アンケートの項目には単一/複数選択があり,これらを保存する先のテーブルは1つにまとめたいがプログラム上では別のモデルとして扱いたい場合にSTIを使うと良い.

継承したモデルと別のテーブルとの間にリレーションを作成するとkeyが見つからないと怒られることがある.

has_manyforeign_keyを指定すれば良い.以下のように書ける.はず.

class Answer < ActiveRecord::Base
  has_many :item_answer_relation
  has_many :checks, through: :item_answer_relation
  has_many :radios, through: :item_answer_relation
end

class Item < ActiveRecord::Base
end

class Check < Item
  has_many :item_answer_relation, foreign_key: 'item_id'
  has_many :answers, through: :item_answer_relation
end

class Radio < Item
  has_many :item_answer_relation, foreign_key: 'item_id'
  has_many :answers, through: :item_answer_relation
end

参考: - ruby on rails - Single-table inheritance with relationships? - Stack Overflow


サンプルコード書いてて若干自信なくなってきたので間違ってたら教えてください

Ridgepoleでfk設定するときはnameが必要

Railsで

$ rails g model Hoge fuga:references
$ rake db:migrate
$ rm -rf db/migrate

みたいな感じでモデル新規作成時だけ一旦マイグレーションファイル作ってからRidgepoleのSchemafileにdumpして… みたいな運用してたら詰まった.

ActiveRecordのreferencesはadd_foreign_key "hoge", "fugas"みたいな感じで名前を設定しないので,このままdumpするとSchemafileにも名前なしの外部キーが出力される.これをDBにapplyしようとすると

Apply `db/schemas/Schemafile`
[ERROR] Foreign key name in `hoge` is undefined
rake aborted!
Command failed with status (1): [bundle exec ridgepole -Edevelopment -c con...]
...

みたいな感じでエラーを吐く.修正するには

  1. db/schema.rbのfkに名前を設定
  2. Schemafileのfkに名前を設定
  3. $ rake db:resetとか実行しておく

みたいなことすればよさそう.

ちゃんと名前を設定しようという話でした.


外部キー詳しくないまま使ってるのだけど,Ridgepoleで名前の設定を強制させる理由ってなんだろう.Rails側が無名で出力できるんだからわざわざraiseすることなくてwarnとかでとどめておけば良いのに.

RailsでPOSTリクエストのbodyをJSONで受け取る

application/jsonを受け取りたい場合

def params
  @params ||= JSON.parse(request.body.read, {:symbolize_names => true})
end

書いとくとapplication/x-www-form-urlencodedの場合と同じ感じでparamsを受け取ることができる.APIつくるときに便利.

skip_before_action :verify_authenticity_tokenないとCSRFトークンのチェックでコケると思う.これ書くのにAPIを統括するコントローラとか挟むのが定石だと思うので,そのあたりに書くとよさそう.

参考

もっといいやり方あったら教えてください