rails
開発環境にmongrel_clusterの1.0.5を入れてソースを眺めていたら、cluster::statusと言う新しいコマンドが増えていたのだけれど、リストに出てこなかったので、0.2.1をアンインストールしたら出てきた。 この辺りはgem_pluginの仕様なんだと思うけど、仕組み…
ActiveRecord::Base.connection.execute(sql) 返ってくるのは生のResultSetなので、アプリ側で解釈する必要がある。以下の例ではMySQLの場合。 rs = ActiveRecord::Base.connection.execute("show processlist") puts rs.class #=> Mysql::Result rs.each{|r…
gemでインストールするMySQL/Rubyのバージョンは2.7と少々古いので、念の為に2.7.4にバージョンアップしておく。 require 'mysql' Mysql.const_get(:VERSION) => 20704 でバージョンをチェックする。 20704だと2.7.4になる。 今見てみたら1.9対応の2.8pre1が…
ActionMailerのソースを読んでいたら、 adv_attr_accessor :bcc と言うコードが合ったので、このadv_attr_accessorという謎のメソッドを調べてみた。 短かいコードだったので全文引用してしまう。 module ActionMailer module AdvAttrAccessor #:nodoc: def …
BackgrounDRbのサンプルでよく見かけるのが以下のようなソース。 def start_background_task session[:KEY] = MiddleMan.new_worker(:class => :foo_worker, :args => "hoge") end #start_background_task.rhtmlから非同期で呼ばれるアクション def update_p…
Railsをproduction環境で運用していると、こんなエラーが頻発していることに気が付いた。 Processing ApplicationController#index (for ::1 at 2007-08-07 15:51:09) [GET] Session ID: 006a27e09f46dfe1bd6f6cc2258cfa8e Parameters: {} ActionController:…
ActiveRecordの==はどう動くのか気になったので調べてみた。 例えばSNSで日記にユーザからコメントがついた場合、新着に表示する時にはまず日記を書いたユーザとコメントを書いたユーザが別かどうかを判定しなきゃいけない。 早速ソースを読む。 def ==(comp…
例えば以下のようにlink_toメソッドを呼び出してリンクを作成すると、HTTP的にはPOST扱いとなる。 link_to("削除", {}, :confirm => "削除する?", :delete) HTTPリクエストは以下のように発行される。 POST / HTTP/1.1 (中略) _method=deleteで、このリクエ…
RubyのLoggerは簡易的ながらもローテーションする事ができるのでそれを使えば簡単にローテーションを実現できる。 config/environments/development.rbに以下を追記すると日毎にローテーションするようになる。 config.logger = Logger.new(config.log_path,…
以下を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(object_…
ActiveSupportの拡張。 Stringでnilもしくは空文字列を判断する制御文がシンプルになる。 #before if str && !(str.empty?) #after unless str.blank? 実装はこちらを。 http://dev.rubyonrails.org/browser/trunk/activesupport/lib/active_support/core_ex…
Base.set_field_namesメソッドでは定義したカラム名と日本語名の対照用ハッシュ(@field_names)を作成する。 そして、ActiveRecord::Base#human_attribute_name(column_name)と言うメソッドをaliasにより独自メソッドに置き換え、引数のカラム名が@field_name…
以下のようなコードをアクションに書いたらシンタックスエラーになってしまった。 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句を構築するのに結構手間がかかるので、いくつかpluginが公開されている。 http://d.hatena.ne.jp/yukiwata/20070524/1179977530 とは言うものの、どれも機能的には貧弱に見えたのでこれだったら我慢して直で書いちゃおうかな、と思っていたらez…
Trixieに突っ込んでIEでRDoc開いてみたら普通に動いた。素敵。 ただ、何故かは分からないけどIEだとARのRDocが開けない…。XMLパースエラーとか出ちゃう。 全文検索もあることだし、Railsに限ればHTMLHelp(Rails の htmlhelp - 2nd life)の方が個人的には便…
rake -Tでrakeタスクの一覧を表示できることを知った。 capistranoはrakeタスクを追加するらしいけど、それも見れるみたい。 とりあえずテスト環境で動かしてみた。 rake db:fixtures:load # Load fixtures into the current environment's database. Load s…
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が発生するのは無駄って事で大抵キャッ…
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とyaml_wamlをインストールして動かしてみて10分ほど放置。だがまったく終わらない。 インタラプトしてカウンタを仕込んで目検してみるに、どうも秒間5〜6件程度しか処理できていない気がする。 対象…
ActiveRecordでSQLServerからMySQLにデータを移行するスクリプトを書いているときに躓く。 正直全部書ききれないので端折って結論だけ書いてしまう。 Windowsの処理系においてTime.localメソッドはGMTとの時刻差を前提に入れて書いておかないとハマる。 これ…
DBMSのカラムタイプはMigrationで定義している抽象化されたシンボルをキーにした各アダプタで定義されたハッシュから取得しているので、このハッシュに定義されていないもの、例えば add_column(table_name, column_name, "tinyint", options = {}) と言った…
メモ。 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…
created_atやupdated_atは便利なカラムではあるが、データ移行にARを使う時にただデータを移したいだけなのに勝手にデータを更新してしまってちょいありがた迷惑な感じに。 ググってもやり方が出てこなかったのでARのソースをGrepする。 それっぽい箇所がtim…
migrationの設定とARの関係。 ARとMySQLの関係。 をよく分かってないことに気づいたのでちょっと調べる事に。 migrationの定義はこんな感じ class CreateHoge ActiveRecord::Migration def self.up create_table :hoge do |t| t.column :i1 , :integer , :nu…