Tech Racho エンジニアの「?」を「!」に。
  • 開発

Rails勉強会まとめ -- Rails4のスキーマキャッシュなど

こんにちは、hachi8833です。今回も、弊社CTOのbabaさんによるRails勉強会スライドから引用して記事にします。
勉強会自体はRails 3.x時代のものなので既出が多くなっていますが、棚卸しも兼ねて今のうちに記事にいたしました。

Changelogの読み方

言うまでもありませんが、RailsのChangelogには多くの有用な情報が含まれています。たとえばAction PackのChangelogを例に取ってみましょう。
github1

「#16520」のような数字はGithubのIssue番号を表しています。右端のIssueボタンでIssueを参照・検索できます。

github2

そしてご存じの方も多いと思いますが、「CVE」(日本語版)は、Railsに限定されない脆弱性情報です。Common vulnerabilities & Exposureの略ですが、日本語は「共通脆弱性」と端折った訳語になっています。ChangelogでCVE情報が記載されてたら、該当するCVE-IDを参照しておきましょう。

コマンドラインのエイリアス

小ネタです。毎回bundle execと打つのはだるいけど、Gemがプロジェクトフォルダのvendor/bundle以下にあることも意識しておきたいので打たないようにするのもいやだということであれば、シェルでエイリアスを作って楽をしましょう。bundle execをbeにしたり、bundle installをbi、git grepをggなどと略すとはかどります。bundle exec cucumber --require featureなどという長くてよく使うものもcukeなどと略したりしてます。

alias be='bundle exec'
alias bi='bundle install'
alias gg='git grep'
alias cuke='bundle exec cucumber --require feature'

ホームディレクトリの~/.bashrcに上記のエイリアスを追加して、ターミナルを新規に開くか「source .bashrc 」や「. .bashrc 」を実行すればエイリアスが有効になります(sourceと.の違いについてはこちらをどうぞ)。

ルーティングでUTF-8が使用可能

Rails4のルーティングでは、実はUTF-8を扱えるようになっています。その気になれば日本語URLをルーティングできるということですね。Rails 4.1.1 + Ruby 2.1.2でやってみると確かにできました。SEO的に不利な感じがするので社内システムでもなければやる人はほとんどいないと思いますが。

route1

route2

Rails 4でのDynamic Finder非推奨化

Rails 4で話題になったのが、Active RecordのDynamic Finderが非推奨になったことでした。Dynamic Finderとは、たとえばChokinというモデルにzandakaというフィールドがあるとすると、
Chokin.find_by_zandaka(2000)のようにzandakaの部分を持つメソッドが自動的にActive Recordによって生成されるというものでした。

  • find_by -- Rails4からの推奨
  • 実はfind_by!もあります。レコードが見つからない場合にエラーになる点が異なります。
  • find_all_by や find(:all) -- 今や非推奨。whereなどで置き換えてください。

Active RecordとRubyのmethod_missingの典型的な活用例だったのですが、現在はActive Record deprecated Finder gemとして余生を送っているようです。一応Rails 5まではメンテされるそうです。

Railsdocも参照してください。

Rails 4のスキーマキャッシュ

Rails4でスキーマキャッシュがActive Recordに追加されました。プロジェクトディレクトリでrake -Tを実行すれば確認できます。
schema

これは当時の記事にもあるように、モデルが多数あるRailsアプリケーションの起動を速くするのに使われます。config/production.rbにconfig.active_record.use_schema_cache_dump = falseと書くことでスキーマキャッシュを無効にできます。
この機能を使用する場合、スキーマを更新したときにキャッシュも忘れず更新または削除するようにしてください。

おまけ

  • 最近のRailsでは、被除数がfloatの場合、ゼロ除算を行っても例外が発生せず、Infinity扱いされます。Rails 3.2系でDateTimeがInfinityをサポートするようになった関連かもしれません。Rails 4.1.1 + Ruby 2.1.2でも動作を確認できました。

    infinity


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。