あんパン

こしあん派

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を統括するコントローラとか挟むのが定石だと思うので,そのあたりに書くとよさそう.

参考

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

今年のFirefox OS活動

これは Firefox OS Advent Calendar 2015 21日目の記事です。

去年も一昨年も21日に書いていたので今年も21日、と思って今日書きます。

本当はちゃんと開発記事を書こうかと思っていたのですが、卒論その他で余裕がなく今年やったFirefox OS関連の活動とか感想とかでお茶をにごします。といっても、それすらも数少ないのですが、、

Firefox OS大喜利ハッカソン #2

atnd.org

意外と今年もハッカソンしてました。そのときの成果がこれ。

masawada.hatenablog.jp

Apple Musicの登場に伴い引退。

特に理由はないのですが、今度からハッカソンをするとしたら主催が自分個人に変わるような気がしています。

学内向けJavaScript講習

すごい雑だったのですが、JavaScript講習というものを大学の学生向けに行いました。最後の方はFirefox OSのアプリを作る、みたいなこともしました。id:miki_bene くんが全面的に手伝ってくれてなんとかなったという感じ。お世話になりました。

これからやりたい

2,3月くらいになれば今の作業類も終わりあとは卒業式を待つだけという状態になります。そのあたりで活動を再開したいなぁと思っています。

とはいえ、先日発表があったとおりキャリア経由でスマートフォンが発売されなくなるということもあり、スマートフォン向けのアプリを作るアプローチが少し難しくなるのではないか、などとも思っています。

  • Firefox OSをRPi Zeroにインストールしてみる
    • とくに意味はなさそう
    • 単純にOpenWebBoardよりも小さい端末で動いてすごい感を味わいたい
    • Gluinと繋いでもよさそう
  • Firefox OS TVを買う
    • 夏くらいから一人暮らしの予感なので、そしたら買えそう?

と、こんなところでそろそろ日をまたぎそうなのでここまでにして公開します。来年はまともな記事を書きたい。

高専カンファでScratchXの話をしました

昨日、高専カンファの複数トラック発表でScratchXの話をしました。

長引く体調不良と睡眠不足によりスライドが雑なのはご容赦ください。

ScratchXの開発環境の話が雑に終わってしまったので、新しく記事を書きました。この話を期待していた人は以下をご覧いただければと思います。

masawada.hatenablog.jp

また、昨日デモに使ったゲームは以下で公開しています。

scratch.mit.edu

octhitというタイトルですが、発表ではScratoonという名前で出しました。

発表に使ったプログラムファイル群は以下のリポジトリにあります。

github.com

感想とか

高専カンファ、いろいろなところで開催されていて存在は知っていましたが、場所が若干遠かったりして行く気力が起きず今回が初参加でした。初参加で100回目で会場が電通大で発表できる、幸せな体験だったと思います。誘ってくれた id:marin72_com ありがとうございました最高でした。

あと1日目は体調不良と資料作成(主に後者)のため懇親会含めて参加しませんでした、懇親会パートリーダーの id:alice345 くんには申し訳ないことをした…

なお id:alice345 くんの懇親技術情報は以下の記事です

alice345.hatenablog.com

また近場で開催されたら参加したいなぁ。