Hatena::ブログ(Diary)

130単位

2013-09-03

Rails ポリモーフィック関連の関連名の命名

Railsポリモーフィック関連という機能があります。

class Picture < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end

class Employee < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

class Product < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

ざっくりいうと、複数の親Modelに属するような子Modelの関連を抽象化してまとめる機能です。詳しくはRails Guidesや以下のリンク先を参照ください。

関連名

ここで注目したいのが、Modelを関連づける関連名です。Rails Guidesの例にある "imageable"。聞き慣れないですが、どうなんでしょう。確かにimageは動詞でもあるため文法的には間違ってなさそうです。が、実際に扱おうとすると違和感が生じてきます。

親Modelから子Modelを参照する際は通常の関連と同様に扱えます。

pictures = employee.pictures

逆に子Modelから呼び出そうとすると、以下のようになります。

employee = picture.imageable

imageable というメソッドで employee が返るのはちょっとわかりにくい気がします。

命名具体例

調べていて、関連名の付けかたには2種類あるように見受けられました。(見出しは造語です)

able接尾辞
子Model関連名親Model
Comment :commentable Article/Photo
Address :addressable Person/Company
AttachmentImage :attachable Blog/Entry
抽象名詞
子Model関連名親Model
Item :parent User/Machine
Comment :resource Diary/Book/Shop
Paste :item Snippet/Picture
Employee :work_place Office/Factory

抽象名詞のほうで"parent"や"resource"は抽象度が高く、(開発者間で納得できれば)汎用的に使えそうです。英語の意味的には"object"も使いたいところですが、object_idが予約されているため使えません。

命名比較

able接尾辞
  • able接尾辞なModuleをincludeする感じ
  • 関連名が動詞+ableなので悩まなくて済む
  • 子Modelから親Modelの呼び出しがわかりにくい
  • Rails Guideで例示されているということは推奨なのかもしれない
  • 海外のBlog記事ではable接尾辞の採用が目立つ
抽象名詞
  • 抽象名詞なClass継承する感じ(STIのような命名)
  • 適切な関連名が見つかるかどうかは対象Modelと語彙力に依存
    • ここで割と具体的な名詞を使うと他のModelに使える名詞がひとつ減る(細かいけど)
  • 子Modelから親Modelの呼び出しがまだわかりやすい
  • 日本人エンジニアは抽象名詞を採用している例が見受けられる

まとめ

特に結論はありません。初めて使ってみた印象などを書いてみました。どちらを選択するかは好みの問題だと思います。ちなみに、自分のケースでは抽象名詞を採用しました。やはり子Modelからの参照時に名詞であったほうが違和感が少ないように思えたからです。たとえ返るObjectがメソッド名と異なったとしても、ですね。(ただし命名には苦労しました…)

ご意見などあれば遠慮なくいただけるとありがたいです!


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

4797363827
Rails3レシピブック 190の技

2013-07-06

フィリピンでMinaの開発者と会いました

Mina

約1年前にデプロイツールCapistranoの対抗として登場したMina。自分も少しだけ使ったことがありました。ただ最近は開発がアクティブでなかったため、Capistranoでいいじゃんとツイートしたこともありました。そんなMinaフィリピン発なんですね。

で、自分が今フィリピンにきていて、Minaを現地エンジニアとの話のきっかけにしたりも何度かしました。そして開発者の GitHub followers が500超なのを見るに、Nadareiというチームはおそらくフィリピンで一番いけてるエンジニア集団なのではないかと勝手に想像してました。そんないけてる開発者と、あわよくば会えたりしたらいいなあと思っていました。

Manila.js meetup

Mina開発者が発起人でもあるManila.jsというコミュニティ。月イチでミートアップを開いていて*1、たまたま当日の開始1時間前に気づくことになったんですね。

Manila.js JavaScript meetup 016

チケットはSOLD OUTだったんですが、インターンの縁を利用して参加可能か確認して、勢いで参加してみました。バスとジプニーを計4台乗り継いでなんとか辿り着いたときには既にイベント終了間際でした。発起人 @rstacruzJSクイズを出してノベルティをプレゼントしてました(jQueryの最新バージョンは?とかEmber.jsの開発者は?とか)。

f:id:deeeki:20130705045610j:image

Recorded videos

Talking w/ authors

イベント終了後、これまたありがたいことにインターンエンジニア仲介してもらって、@rstacruz 、そしてチームメンバーでMinaメイン開発者である @mikong と話すことができました。

  • 忙しかっただけで開発意欲はあって、つい最近Issue処理を再開したこと
    • "please be patient" といわれた
  • submodule対応のpull reqを送ったことがあること
  • 本番環境で使っているか?と聞かれて、いや趣味でだと答えたこと*2
  • チームでは基本的にRailsアプリを開発していること
    • でも最近はアプリの8割くらいJSを扱ってたりすること
  • どうやってインターン先を見つけたのかということ

衝撃だったのは、"マイナ"だと思っていた読み方が実際は"ミーナ"だったことでした。

それにしても、先にプロダクトの利用、PRがあったのちに、こうしてリアルに海外のエンジニアと会って話せるというのは感慨深いものですね。もっとこういう体験をしてみたいと強く思いました。できればプロダクト提供側としても、というのと、技術的な深い話もできるよう英語力を上げていきたいですね。

JSConf.asia

今年の11/28-29にマニラで開催予定だそうです。興味のある方は行ってみるといいんではないでしょうか!(スピーカーも募集しているみたいです)

関連記事

*1:今月で4回目

*2:実際は既にCapistranoに置き換えたのだけど

2013-04-01

Railsの学びかたについてLTしました #mtsmhack

久々にRails×初心者向けというテーマを設けて、ついでに発表してみました。

初心者向けブログ記事とかも多数あったりしますし、なるべく独自性のある内容を心がけてみたつもりです。

  • 自分の経験談
  • 初心者向けの話
  • Railsで仕事したい人向けの話
  • +αとしてテストと英語についての話

と4つのセクションで話してみましたが、対象の幅が広いため伝わりづらい部分もあるかもしれません…。あと思った以上に長く喋ってたみたいでそこも反省ですね><

補足とか

Railsおすすめ書籍
勉強会
初心者向けRSpec tips
  • before/itの説明は無しでもいい
    • コードで読めばわかると思うのでテンポよくテストこなすためには無しでもいいかなと
  • letは使わずbeforeで前提処理を統一
    • letは実行効率はいいのでしょうけど、呼ばれないと発生しないことで嵌る可能性もあるためbeforeがいいかなと
  • itで複数のexpectationを書いてもいい
    • 特にインテグレーションテストでは検証対象が増えがちで、まとめて書いてもいいかなと
フィリピン英語留学とか
  • 経験やツテがあったりするので興味ある方は気軽に聞いてください!
質問:なぜRailsなのか

当時触っていたPHP(CakePHP)に限界(書きづらさ)を感じていて、たまたまRailsの仕事があって、新しいことをやってみたいとも思っていて、担当させてもらいました。またCakePHPが参考にしたRails、いわば本家なわけでCakeよりは書きやすいだろうというのと、仕事以前に趣味で素振りしていた感触も良かったこと、国産の言語であること、自信のある語り口で楽しそうに話されていたまつもとさんの講演の印象が強かったこと*1、そういったさまざまな要素も絡んで、時間を費やしてでもやる価値はあると判断しました。

質問:個人のアプリで評判が良かったものは

自分に関していえば、実はRailsアプリで公開しているものはまだありません(作成途中で未完成なものはありますが)。仕事でRailsを触っていたのでそれで精一杯だったというか、満たされていたというのも関係してるかもしれません*2

関連して思うこと

Ruby/Railsで仕事したいけどできない駆け出しエンジニアRuby/Rails技術者がほしいけど見つからない会社、の両方の苦労を聞いたりしていて、なんとかそこの溝を埋められたらいいなあとぼんやり考えていたりします。やはり即戦力かどうか、が線引きになるんでしょうけど、自分のように仕事でなかったらそのレベルは身に付かないという人も多いと思うんですよね。なので余裕のある会社さんは懐広く受け入れてみてほしいですし、エンジニアの方々もある程度はリスク覚悟でチャレンジしてみてほしいなと思います。あ、Ruby/Railsの仕事自体も増えるといいですね!


【追記】質問されたこと書き加えました(2013-04-01 22:20)


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

4797363827
Rails3レシピブック 190の技

関連記事

*1http://d.hatena.ne.jp/deeeki/20090214/matzseminar

*2Rails覚えたての頃に、慣れていることを理由にCakePHPで人気のスライドを集めるサイトをつくってたくさんはてブいただけたことはありました

2012-12-24

デプロイ用gem CapistranoとMinaの比較

Capistrano

  • 多機能
  • capify -> cap setup -> cap deploy
  • Capfile, config/deploy.rb
  • バージョン管理しない共通ファイル/ディレクトリの管理に一工夫いる
    • symlinkを張るタスクを定義する必要あり
  • バージョン管理しない共通ファイル/ディレクトリは :shared_children 変数で管理できる
  • git以外のSCMにも対応
  • remote-cache strategyは--recursiveなnon-bareリポジトリを保持
    • submodulesがあっても早い
    • scpによるstrategyもある
  • リリースパスにコピーしたあと.gitは消さない
  • リリースのバージョンはタイムスタンプ
  • capistrano-ext gem でマルチステージ対応
  • GitHubのヘルプにあるくらいデファクトともいえる

Mina

  • シンプル
  • mina init -> mina setup -> mina deploy
  • config/deploy.rb のみ
  • バージョン管理しない共通ファイル/ディレクトリの管理が楽
    • shared_paths にパスを配列で指定すれば良い
  • gitのみ対応
  • bareリポジトリを保持
    • submodulesがある場合時間がかかる
  • リリースパスにcloneしてから.gitを消す
  • リリースのバージョンは連番
  • マルチステージ非対応
  • フィリピン マニラ発プロダクト

Mina雑感

導入に関しては特に問題ありませんでした。Capistranoの経験があれば、デフォルトのテンプレートを読めばほぼ理解できました。ただでかいsubmodule(WordPress)を含むリポジトリで試してみたのですが、デプロイの度にsubmoduleをcloneするので毎回時間がかかるのがいけてないところです(せっかくなのでPull Request送ってみました *1 )。良く言えば、まだまだこれから進化する余地のあるプロダクトといえます。

  • SCMがgitでsubmoduleなし
  • プロジェクトが小規模でデプロイが本番のみ
  • 新しもの好き、Minaにパッチを送って使いやすくしたい

このような条件/環境であれば、Minaを使ってみるのもいいかもしれません。そうでなければ、プロジェクト間の統一性の観点から、現状ではCapistranoを使っておいたほうが無難かと思います。

あわせて


4873114934
ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE)

2012-08-08

iTerm2のVimでトラックパッド範囲選択コピーする

ゆるいVimmerなので、たまにトラックパッドからカーソル選択でコピーすることがあります。Terminal.appではCmd+Cでできてたのですが、iTerm2に変えたらできなくなって若干困ってました。ビジュアルモードで選択した扱いになってしまいます。そこで、設定により通常選択を可能にする方法です。

  • Preferences > Profiles > Terminal > Terminal Emulation
    • Enable xterm mouse reporting を OFF

f:id:deeeki:20120808233357p:image

ググってもなかなかヒットしませんでしたが、以下のページに書いてありました。

またiTerm2の機能により、Cmd+Cしなくても選択しただけでクリップボードにコピーされます。ちなみに上記設定ONの状態だと、Optionキーを押しながらカーソル選択する必要があるみたいです。