タグ

ブックマーク / blog.willnet.in (12)

  • find_by_sql したレコードで preload する方法 - おもしろwebサービス開発日記

    どうしても AR の query methods だけでは要求を満たせない場合の最後の手段として、find_by_sql メソッドがあります。皆さんよく使ってると思うのですが、戻り値のレコードからさらに association をロードしようとすると N+1 になるケースがあります。かといって User.preload(:comments).find_by_sql(sql) のようにしても期待通りには動きません。単純に preload 部分が無視されるだけです。 ではどのように書いたらよいでしょうか。 次のように書くと期待通りに動きます(Rails 4.2.1 で試しています)。 records = User.find_by_sql(sql) ActiveRecord::Associations::Preloader.new.preload( records, :comments ) re

    find_by_sql したレコードで preload する方法 - おもしろwebサービス開発日記
    ryonext
    ryonext 2015/06/15
  • 最近の Rack サーバ事情について - おもしろwebサービス開発日記

    先月、heroku推しサーバが unicorn から puma に変わったという発表がありました。unicorn だとスロークライアントの影響を受けやすいというのが理由なようです。 もう少し詳しく調べてみましょう。 そもそもスロークライアントってなに その名の通り遅い回線のクライアントです。3G環境のモバイル端末などが該当します。 「unicorn だとスロークライアントの影響を受けやすい」とは unicorn はプロセスモデルのサーバであり、blocking I/O モデルを採用しています。つまり、クライアントとの通信中プロセスが専有されるということです。 例えば unicorn がワーカプロセスを3つ立ち上げていて、そこへ通信完了に10分かかるようなスロークライアントが3つ接続されたら…、続くクライアントはスロークライアントの通信が完了するまで実行を待たなければならなくなります。プ

    最近の Rack サーバ事情について - おもしろwebサービス開発日記
    ryonext
    ryonext 2015/02/25
  • timecop のちょっと便利な書き方について - おもしろwebサービス開発日記

    みなさん、 timecop 使ってますか?timecop は、テストで時間を扱う時に必須と言えるライブラリです。テスト中の時間を止めたり(Timecop.freeze)時間を移動させたり(Timecop.travel)できます。似たようなライブラリとして delorean があります。RailsCasts でも紹介されています。 さて、timecop の README には下記のようなコード例が書いてあります。 t = Time.local(2008, 9, 1, 10, 5, 0) Timecop.travel(t) 僕はこれまで上記のように書くしか方法が無いと思っていたのですが、今日下記のようにも書けることに気づきました。 Timecop.travel(2008, 9, 1, 10, 5, 0) また、ブロックを使うこともできます。 Timecop.travel(2008, 9, 1,

    timecop のちょっと便利な書き方について - おもしろwebサービス開発日記
    ryonext
    ryonext 2014/05/27
  • パーフェクト Ruby on Rails という本を書きました - おもしろwebサービス開発日記

    ここのところブログの更新頻度が下がっていたのはそういうことです。 @sugamasao、@udzura、@joker1007と共同で書きました。 パーフェクト Ruby on Railsposted with amazlet at 14.05.02すが まさお 前島 真一 近藤 宇智朗 橋立 友宏 技術評論社 売り上げランキング: 272 Amazon.co.jpで詳細を見る 執筆経緯 個人的な発端は去年の9月くらい。当時常駐していた会社のメンバーたちでランチ行く途中、@udzuraさんに「Railsを書く話があるんですが興味あります?」と聞かれたので、査読でもお願いされるのかなと思いながら「興味ありますよー」と答えたらいつの間にか著者になっていました。とはいえ、もともとRailsは一回書いてみたいと思っていたので結果オーライ。 どんななの このは、著者陣たちが「Railsを始

    パーフェクト Ruby on Rails という本を書きました - おもしろwebサービス開発日記
    ryonext
    ryonext 2014/05/03
    楽しみにしてます!
  • Rails 4.1.0 で新しく導入された便利メソッド - おもしろwebサービス開発日記

    Rails(ActiveSupport) は標準クラスを拡張した便利メソッド群を提供してくれています。時々これは使わないなー…という微妙なやつもありますが、僕はけっこう好きです。 Rails 4.1.0 で新しく入ったそんなメソッドをまとめます。 Numeric#in_milliseconds 数値をミリ秒の単位に合わせて返す。 1.hour.in_milliseconds #=> 3600000 実装は単に1000倍しているだけ。 def in_milliseconds self * 1000 end すごくたまに使うかもしれない。 Date#middle_of_day, DateTime#middle_of_day, Time#middle_of_day 昼の12時を返す。 date = Date.today date.middle_of_day => Sat, 19 Apr 2014

    Rails 4.1.0 で新しく導入された便利メソッド - おもしろwebサービス開発日記
  • ランダムで日本人の名前を返す gem を作った - おもしろwebサービス開発日記

    gimei という、ランダムで日人の名前を返す gem を作りました。 似たようなライブラリに faker があります。faker は人の名前だけではなく、住所やメールアドレスやユーザ名や電話番号など、たくさんのジャンルのダミーデータを返してくれるすごい gem です。しかも i18n に対応しており、yaml ファイルを定義すれば日語も使えます。 じゃあ faker でいいじゃん!って思いますよね。しかし一つだけ問題がありまして…。ふりがなが使えないのです。 そこでgimeiです。gimeiは下記のような形でふりがな(フリガナ)に対応しています。 gimei = Gimei.new gimei.kanji #=> "斎藤 陽菜" gimei.hiragana #=> "さいとう はるな" gimei.katakana #=> "サイトウ ハルナ" gimei.last.kanji #

    ランダムで日本人の名前を返す gem を作った - おもしろwebサービス開発日記
    ryonext
    ryonext 2013/07/10
    よさげ
  • Cells で params や cookies を扱うテストを書く - おもしろwebサービス開発日記

    それなりに大きめなRailsアプリを書くとき、Cells を使うと部分テンプレート単位で controller のようなものを作ることができて、controller の肥大化を防ぐことができます。たいへん便利です。 Cells に対してのテストも普通に書けますが、params や cookies を設定してテストをする方法がドキュメントに書いてなかったので調べました。下記のようにします。 class HogeCellTest < Cell::TestCase test "indes" do @controller.params[:hoge] = 'fuga' @request.cookies[:hoge] = 'fuga' invoke :index assert_select "p", 'hogehoge' end end

    Cells で params や cookies を扱うテストを書く - おもしろwebサービス開発日記
    ryonext
    ryonext 2013/05/26
    そもそもCells知らなかった
  • Rails4.0に含まれる strong_parameters について - おもしろwebサービス開発日記

    注意 このエントリは急いで書いたので間違いが含まれている可能性が高いです。気づいた方はご指摘ください。 序文 strong_parameters とは、mass assignment で余計なパラメータをモデルの属性にセットさせないための新しい仕組みです。Rails 4.0 からはこれが標準になります。Rails2.x と 3.x はattr_accessibleやattr_protectedなどで似たような機能が提供されていましたが、これだと管理が煩雑になるケースがありました。 今年の3月くらいにGitHub が mass assignment の脆弱性を突かれたことで 、この問題をどうにかしようという流れが起き、最終的に strong_parameters が作られるという経緯を辿りました。 mass assignment とは Rails ではこんなコードをよく見ると思います。 de

    Rails4.0に含まれる strong_parameters について - おもしろwebサービス開発日記
    ryonext
    ryonext 2013/03/31
  • rbenv をさくらVPSのサーバにインストール - おもしろwebサービス開発日記

    rbenv をさくらのサーバに system wide にインストールする手順のメモです。 インストール準備 ruby のインストールに必要そうなものを yum でインストールします。 sudo yum install libyaml libyaml-devel zlib zlib-devel readline readline-devel openssl openssl-devel libxml2 libxml2-devel libxslt libxslt-devel rbenv, ruby-build のインストール /usr/local/rbenvにインストールします。staff グループで rbenv を使うことにします。 cd /usr/local sudo git clone git://github.com/sstephenson/rbenv.git rbenv sudo c

    rbenv をさくらVPSのサーバにインストール - おもしろwebサービス開発日記
    ryonext
    ryonext 2013/01/08
  • bundle exec を省略する - おもしろwebサービス開発日記

    Railsアプリの開発に bundler を使うようになって、gem 関連でハマることは少なくなったような気がします。ただ、その代わりに、なにかコマンドを叩くときに bundle exec をつけ忘れてエラーになることが時々あって、そんな時に少々めんどくさく感じます。bundle exec を省略できたらどんなに幸せでしょうか。 そんなわけで、 bundle exec を省略する方法をまとめたので紹介したいと思います。 rvm の gemset をアプリ毎に作って切り替える方法 下記のエントリに詳しくまとまっています。これの通りにやれば bundle exec から解放されるのは間違いないのですが、個人的にはアプリ毎に gemset を作るのは大げさな感じがします。 rvmのgemsetを使ってbundlerと賢く付き合う方法 - Hello, world! - s21g bundler-

    bundle exec を省略する - おもしろwebサービス開発日記
    ryonext
    ryonext 2012/11/06
  • 僕が参考にしている Ruby, Rails の情報源まとめ(海外ブログ編) - おもしろwebサービス開発日記

    昨日 @bekkou68 さんに「前島さんってどうやってRubyRails関連の情報を収集しているんですか?」って聞かれたのでまとめてみます。とりあえず海外のブログ限定で。日ブログ編は気が向いたらやります…。 RailsCasts 有名すぎて説明不要かもしれませんね。毎週2つ(うち1つは有料購読が必要)の Rails 関連動画をアップロードしてくれているサイトです。良質な情報を定期的に届けてくれるすばらしいサイトですね。1ヶ月9ドル払って有料購読する価値は間違いなくあると断言できます。動画中で紹介しているライブラリの情報もすばらしいですが、コード例もかなりRailsっぽく綺麗に書かれていて大変参考になります。 RubyFlow いろいろなRuby開発者のブログの更新情報をまとめたブログ。簡単な紹介文に各ブログのリンクがくっついているような形式です。日によってばらつきがありますが、だいた

    僕が参考にしている Ruby, Rails の情報源まとめ(海外ブログ編) - おもしろwebサービス開発日記
    ryonext
    ryonext 2012/10/04
  • Rails 3 のルーティング定義について - おもしろwebサービス開発日記

    Rails 3のルーティングで気になったところについて。いつものメモです。あくまで気になったところなので全部網羅しているわけではありません。あしからず。 基map.connect から match メソッドに変更。オプションも下記のように変更。 # Rails 2 map.connect 'products/:id', :controller => 'products', :action => 'view' # Rails 3 match 'products/:id', :to => 'catalog#view' # :to は省略可能 match "/account" => "account#index" # :controller/:action 形式であればさらに省略可能 match "account/overview" Named Routes asオプションで指定するように

    Rails 3 のルーティング定義について - おもしろwebサービス開発日記
    ryonext
    ryonext 2012/04/11
  • 1