rails

mongrel_clusterは複数バージョンが混合していると古いバージョンが使われる

開発環境にmongrel_clusterの1.0.5を入れてソースを眺めていたら、cluster::statusと言う新しいコマンドが増えていたのだけれど、リストに出てこなかったので、0.2.1をアンインストールしたら出てきた。 この辺りはgem_pluginの仕様なんだと思うけど、仕組み…

ActiveRecordから生のクエリを実行する

ActiveRecord::Base.connection.execute(sql) 返ってくるのは生のResultSetなので、アプリ側で解釈する必要がある。以下の例ではMySQLの場合。 rs = ActiveRecord::Base.connection.execute("show processlist") puts rs.class #=> Mysql::Result rs.each{|r…

MySQL/Rubyのバージョン確認方法

gemでインストールするMySQL/Rubyのバージョンは2.7と少々古いので、念の為に2.7.4にバージョンアップしておく。 require 'mysql' Mysql.const_get(:VERSION) => 20704 でバージョンをチェックする。 20704だと2.7.4になる。 今見てみたら1.9対応の2.8pre1が…

adv_attr_accessorの実装から感じるRailsの哲学

ActionMailerのソースを読んでいたら、 adv_attr_accessor :bcc と言うコードが合ったので、このadv_attr_accessorという謎のメソッドを調べてみた。 短かいコードだったので全文引用してしまう。 module ActionMailer module AdvAttrAccessor #:nodoc: def …

BackgrounDRbのWorkerオブジェクト削除タイミングについての悩み

BackgrounDRbのサンプルでよく見かけるのが以下のようなソース。 def start_background_task session[:KEY] = MiddleMan.new_worker(:class => :foo_worker, :args => "hoge") end #start_background_task.rhtmlから非同期で呼ばれるアクション def update_p…

Apache(mod_proxy_balancer) + mongrelで運用するときの注意点

Railsをproduction環境で運用していると、こんなエラーが頻発していることに気が付いた。 Processing ApplicationController#index (for ::1 at 2007-08-07 15:51:09) [GET] Session ID: 006a27e09f46dfe1bd6f6cc2258cfa8e Parameters: {} ActionController:…

AR#==

ActiveRecordの==はどう動くのか気になったので調べてみた。 例えばSNSで日記にユーザからコメントがついた場合、新着に表示する時にはまず日記を書いたユーザとコメントを書いたユーザが別かどうかを判定しなきゃいけない。 早速ソースを読む。 def ==(comp…

HTTP POST ≒ request.post?

例えば以下のようにlink_toメソッドを呼び出してリンクを作成すると、HTTP的にはPOST扱いとなる。 link_to("削除", {}, :confirm => "削除する?", :delete) HTTPリクエストは以下のように発行される。 POST / HTTP/1.1 (中略) _method=deleteで、このリクエ…

Developmentモードのログを日毎にローテートする

RubyのLoggerは簡易的ながらもローテーションする事ができるのでそれを使えば簡単にローテーションを実現できる。 config/environments/development.rbに以下を追記すると日毎にローテーションするようになる。 config.logger = Logger.new(config.log_path,…

ActiveSupportに年月表示用のメソッドを追加する方法

以下をenvironment.rbに追加する。 ActiveSupport::CoreExtensions::Time::Conversions.class_eval do def to_yymm strftime("%y/%m") end end MySQLの場合はDateTime型がRubyのTime型にマッピングされるからTime型を拡張している。 YYMM形式で表示したいシ…

date_selectヘルパーの注意点

date_selectヘルパーは引数で渡したインスタンス名とメソッド名から年月日の選択状態を自動的に判断してくれて便利なのだけれど、インスタンスがローカル変数だと値を読み取ってくれず、常に最新の日付になってしまうと言う問題がある。 date_select(object_…

ちょっと便利なObject#blank?メソッド

ActiveSupportの拡張。 Stringでnilもしくは空文字列を判断する制御文がシンプルになる。 #before if str && !(str.empty?) #after unless str.blank? 実装はこちらを。 http://dev.rubyonrails.org/browser/trunk/activesupport/lib/active_support/core_ex…

ActiveHeartはどのようにカラム名の日本語化を実現しているか

Base.set_field_namesメソッドでは定義したカラム名と日本語名の対照用ハッシュ(@field_names)を作成する。 そして、ActiveRecord::Base#human_attribute_name(column_name)と言うメソッドをaliasにより独自メソッドに置き換え、引数のカラム名が@field_name…

Railsではアクション内にConst変数を宣言することができない?

以下のようなコードをアクションに書いたらシンタックスエラーになってしまった。 Item = Struct.new("Item", :value, :name) case type when 'select' item.new(0, "選択して下さい") when 'search' item.new(0, "すべて") else item.new(0, "すべて") end …

ARのWhere句を構築してくれるEz-Where pluginの次期版が良さげ

ARではWhere句を構築するのに結構手間がかかるので、いくつかpluginが公開されている。 http://d.hatena.ne.jp/yukiwata/20070524/1179977530 とは言うものの、どれも機能的には貧弱に見えたのでこれだったら我慢して直で書いちゃおうかな、と思っていたらez…

IEでも動作を確認(RDoc をインクリメンタルサーチする greasemonkey スクリプト - 2nd life)

Trixieに突っ込んでIEでRDoc開いてみたら普通に動いた。素敵。 ただ、何故かは分からないけどIEだとARのRDocが開けない…。XMLパースエラーとか出ちゃう。 全文検索もあることだし、Railsに限ればHTMLHelp(Rails の htmlhelp - 2nd life)の方が個人的には便…

Railsアプリで実行できるrakeタスク一覧を表示する

rake -Tでrakeタスクの一覧を表示できることを知った。 capistranoはrakeタスクを追加するらしいけど、それも見れるみたい。 とりあえずテスト環境で動かしてみた。 rake db:fixtures:load # Load fixtures into the current environment's database. Load s…

ActiveRecordの内部実装を垣間見る その1

ARの実装とRuby処理系のTimeに関する実装でハマる - Lazy Technology にも書いたけど、ARはDBMSのカラム情報に基づいて、格納された値を自動的にキャスト(変換)する。 ar = AR.new ar.id = "hoge" => "hoge" ar.id => 0 キャストするのは格納時ではなく出…

静的ファイルを管理するクラス

負荷対策の為にバッチで予めHTMLを作っておくのは多くのサイトでやっていることだと思う。 Railsでは静的ファイルはrhtmlにしてrender :partialで読み込むか、File.readで読み込むかだろう。 そして、毎回ファイルのIOが発生するのは無駄って事で大抵キャッ…

Magic Multi-Connectionsを試してみる(MySQL版 + 重み付けによる負荷分散)

http://d.hatena.ne.jp/Rommy/20070514/1179164848 sqlite3を使用したMagic Multi-Connectionsの分かりやすいサンプルコードが合ったのでMySQL版を作ってみた。 ただこれだけじゃ芸がないので、1.http://blog.tkmr.org/tatsuya/show/311-twitter-db-railsで…

環境チェックに使えそうなメソッドたち

コンソールから色々調べたい時には ruby script/console 以下、環境の確認に便利なメソッドたち。 Rails::Info Railsの動作環境を表示。 Welcome aboard画面のリンクやruby script/aboutと同じ結果が返る。 しかしこれ、InfoってModuleクラスなのになんでこ…

ar_fixturesが遅い

ユニットテストがしたくなったのでとりあえずar_fixturesとyaml_wamlをインストールして動かしてみて10分ほど放置。だがまったく終わらない。 インタラプトしてカウンタを仕込んで目検してみるに、どうも秒間5〜6件程度しか処理できていない気がする。 対象…

ARの実装とRuby処理系のTimeに関する実装でハマる

ActiveRecordでSQLServerからMySQLにデータを移行するスクリプトを書いているときに躓く。 正直全部書ききれないので端折って結論だけ書いてしまう。 Windowsの処理系においてTime.localメソッドはGMTとの時刻差を前提に入れて書いておかないとハマる。 これ…

MySQLのMigrationで:tinyintを有効にする方法

DBMSのカラムタイプはMigrationで定義している抽象化されたシンボルをキーにした各アダプタで定義されたハッシュから取得しているので、このハッシュに定義されていないもの、例えば add_column(table_name, column_name, "tinyint", options = {}) と言った…

ARはMySQLでtinyint(1)をbooleanにエミュレートする

メモ。 By default, the MysqlAdapter will consider all columns of type tinyint(1) as boolean. If you wish to disable this emulation (which was the default behavior in versions 0.13.1 and earlier) you can add the following line to your envir…

update_atやcreated_atカラムの自動更新を無効にする方法

created_atやupdated_atは便利なカラムではあるが、データ移行にARを使う時にただデータを移したいだけなのに勝手にデータを更新してしまってちょいありがた迷惑な感じに。 ググってもやり方が出てこなかったのでARのソースをGrepする。 それっぽい箇所がtim…

migrateとARとMySQL

migrationの設定とARの関係。 ARとMySQLの関係。 をよく分かってないことに気づいたのでちょっと調べる事に。 migrationの定義はこんな感じ class CreateHoge ActiveRecord::Migration def self.up create_table :hoge do |t| t.column :i1 , :integer , :nu…