Rails

Rails におけるレースコンディションの例とその回避方法

最近立て続けにレースコンディション問題に遭遇したのでメモ。 レースコンディション(競合状態)とは、複数のプロセスやスレッドが共有リソースに対して何らかの操作をする際に、処理のタイミングによって結果が異なってしまう状態のこと。よくトランザクショ…

REST について調べたまとめ

普段仕事でRails を使っている身ですが、Rails 2.x 系を使っているものが1つもない。結構前からRails 3 の話題がでてきている今、そろそろRails 2.x をまともに使っておきたいと思ったので、まずはREST について調べました。最初にREST について調べたのは、…

ActiveRecord でbulk insert/update

mala さんのMySQLにおけるbulk insert と bulk update - 金利0無利息キャッシング – キャッシングできます - subtechのエントリーを見て, MySQL でbulk update ができることを知り, 丁度欲しい機能だったのでとりあえず動くだけのメソッドを実装. # User.ext…

現場で役立つRuby on Railsパターン(RubyKaigi2009)を聴いたまとめ

今年はRubyKaigi に行ってきました。今回聴いたセッションの内、いくつかのメモを残します。全てを1エントリーにまとめるのは量的にも厳しいし、エントリの切り方としても微妙なので小分けにして書いていきます。 あくまでメモなので間違いがあるかもしれま…

SQL のWHERE句の条件に関数を使うとインデックスが使用されない

Rails でfind_by_sql を使う場合に、大きいSQL だと次のようにSQL 中に関数を使ってしまうことがありました。 単純な例だとこんな感じ。 User.find_by_sql([<<-SQL, {:id => 1}]) SELECT * FROM users WHERE IF( :id, id = :id, 1 ) SQL でも、このようにIF …

nano jpmobile

rails で携帯アプリと言ったら定番のjpmobile の超軽量コピー。 できること キャリア判定 端末情報取得 ソース # porting from http://github.com/darashi/jpmobile/tree/0.0.3 class Mobile def self.carriers self.constants - %w[Base] end def self.crea…

GoogleChartAPI Wrapper(QR コード)

Rails でQR コードを出力する必要がありました。要求は以下の3点。 普通のビュー内でも使いたい Helper でQR コードAPI用のURL を生成して、それをimage_tag に渡せばおk QR コードだけポップアップする機能も欲しい Controller でsend_data + ビューでlink_…

Rails はString/Fixnum の違いで結構はまる

昨日、はっまった ^^); ・・・ ActiveRecod.find(id) の id は文字列でも良いが、全てのAPIがそうなわけではない! - yuum3のお仕事日記と全く同じハマり方をしました。 form のselect はハマる 例として、商品を作成するフォーム。商品にはジャンルが指定で…

Rails 1.2.3 〜 2.2.2 までの主な変更点のまとめ

rails の2.x 系をまともに勉強していなかったので、調査しました。コピペの部分も多いですが、情報ソースと共に記述します。 あまり変更点がなかったマイナーアップデートは除外してあります。 1.2.4 2.0 からエラーになる構文に対する警告出力 1.2.4 で警告…

rake rails:freeze:edge が上手く動かない

現在の環境 ruby 1.8.7 rubygems 1.3.1 rails 2.2.2 他のバージョンのrails はインストールしていない 試しにfreeze この状態で、1.2.6のrails アプリに対してfreeze を実行しようとする。 1. config/environment.rb の内容を書き換える(今回の例では1.2.6) …

特定のカラムの編集を禁止したい場合のvalidation

あるテーブルのカラムがシステムのみによって編集される値で、ユーザから編集させたくない場合、そのvalidation が欲しいと思った。 例えば、はてなブックマークのエントリーのタイトルは、ユーザは編集できず、ページのtitle タグの内容で固定したいみたい…

find_by_sql を使う際のTips

読んでいたコードで面白いテクニックを使っていたのでメモ。 Rails のActiveRecord のfind 系メソッドは優秀だと思うけど、自分でSQL を書きたい時があると思います。そこで、find_by_sql を使うわけですが、その際、大規模なSQL を書く場合のTips です。 環…

「クックパッド」のものづくりセミナーに行ってきたまとめ

昨日、ウェブキャリアさんが主催する月間524万人が利用する食のインフラ、「クックパッド」のものづくりセミナーに行ってきました。 クックパッドと言えばRails での大規模リニューアルがニュースになりました。また、大規模開発には向かないと言われたこと…

belongs_to アソシエーションの動作を読む

以下の動作が実際どのような動きをしているかメモ。 class User < ActiveRecord::Base belongs_to :club end User.column_names => ["id", "club_id" ....] user = User.find(:first) user.club => #

rails + lighttpd + fastcgi + logrotate が上手く機能しない

今動かしているアプリケーションで起っている問題です。アプリケーションのログが肥大化するのを防ぐ為に、logrotate でログのローテーションを設定しています。 しかし、ローテーションしたあとはログが書き込まれないという問題が起こってしましました。 …

ruby の再インストールからrails のインストール、テストまでを行うシェルスクリプト(作業メモ)

注:このシェルスクリプトは、僕の環境で動いたものです。汎用的には作られていません ruby 1.8.5 で開発されていたアプケーションがあって、今まで1.8.6 でいじっていたのですが、やはり環境はあわせようと思ってあわせました。その際のメモです。 手作業で…

異なるバージョンのrails をアプリケーション毎に使う方法

これは、自分のマシンに入っているrails は2.0.1 だけど、特定のアプリケーションは1.0.0 で動かしたいという時の解決方法。 方法1. vendor 以下にrails をfreeze する この方法は、アプリケーション内にrails のソースを入れてしまう方法。方法は以下を参考…

autotest の導入方法

前々から使いたかったautotest を導入したので手順を記録します。OS はMac OS X(10.5.5), ruby は1.8.7です。 なお、参考にしたのは「まるごと Ruby! Vol.1(p.124~p.127)」です。 やること autotest のインストール aiutotest を使ってみる autotest のカ…

rails + lighttpd でCSS が読み込めなくてはまった

rails + lighttpd でアプリを動かしてみたのですが、アクセスしたらCSS が読み込めなくて少しはまった。ということで、対応方法をメモ。すごい基本的なことだったんですけどね(ノд`) 環境 OS Red Hat Enterprise Linux ES release 4 (Nahant Update 4) ru…

update_attribute とupdate_attribtues の違い

以前に書いたコードを読んでいると、1カラムの値だけを変えるからといって、update_attribute メソッドを使っている部分があった。これはあまりよくない update_attribute とupdate_attribtues の違い 前者は1つのカラムの値を、後者は複数のカラムの値を更…

Ruby on Rails Summer Festival 2008 に行ってきたまとめ

昨日、Web Career さんが主催しているRails セミナーに行ってきました。 スピーカーは、RAWHIDE. のCTO 吉見 和也さん(あとで読むRailsのススメ - ヨシミ@RAWHIDE. - builder by ZDNet Japan でblog 執筆中)でした。内容は、技術面というより、開発チーム…

機能テストの際の注意

今まで、機能テストで、1つのテストメソッドの中で何回もリクエストを送るコードを書いていたことがありました。テストケースを1メソッドに割り当てると、どうしてもrake が重くなったり、メソッドが増え過ぎたりとあって、index アクションの処理はtest_in…

Rails プロジェクトでのSubversion の無視リストのメモ

windows 用のTortoiseSVN なら、Settings から共通無視リスト(Global ignore pattern)を設定できます。 Rails のプロジェクトの場合は、以下のような感じになります。database の設定ファイル、スキーマの情報ファイル、log 、tmp ディレクトリを除外して…

トランザクションブロックって便利

トランザクションブロックとは 「プログラミングRuby 第2版 言語編」に、トランザクションブロックというものがのっていました。 「プログラミングRuby 第2版 言語編」(p. 46) ブロックは、何からのトランザクション制御の下で実行する必要がある一連のコ…

レスポンス生成直前に動作をかます before_render

rails のアクションに対するコールバックは、filter 機能を使うことで実現できます。 filter には、アクションの実行直前に動作をかます「before_filter」、アクションを実行し、レスポンスが生成された後に動作をかます「after_filter」があります。 これだ…

Gem のバージョンあげたら大変な目にあった

知りませんでした。Gem って、yum とかと同じで、パッケージ管理をするものだと思ってました。今回、Gem のアップデートがあったということで、以下のように「0.9.4」から「1.2.0」にアップデートしたら、「RMagick 1.13.0」が動かなくなった。 最初に、gem …

Hashによるオプション引数とActiveRecord::Base.extract_options_from_args!

以前、メソッドの引数としてHashを使うといいというエントリーを書きました。 Hash引数便利よね - Slow Dance その中で、特にオプション引数に対して有効ということを書きました。 今回は、オプション引数とActiveRecord::Base.extract_options_from_args!を…

検索結果のテスト assert_found

railsでテストコードを書いている際に、次のようなコードが多くあった。 assert_equal [1, 2, 3], assigns(:users).map(&:id) result = User.find(:all, :conditions => ["school = ?", "Hoge"]) assert_equal [2, 3], result.map(&:id) 面倒だ なので、Arra…

Rails 2.1 リリース

Rails 2.1の安定板がリリースされました。新しい機能はこんな感じとのこと。 Rails-2.1リリース - Hello, world! - s21g タイムゾーンのサポート Dirty tracking(なんだか面白そう) Gemの依存関係(前々回のRails勉強会でやってたやつ) Named scope マイ…

テストで、Timeオブジェクト同士を比較するときのメモ

テストを書いていると、こんな風にTimeオブジェクト同士を比較する時があります。 assert @user.save assert_equal Time.now, @user.reload.updated_at まぁ、updated_atはrails側でもテストしているのでやる方はあまりいないかもしれませんが、自分でも「ev…