Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?

Help us understand the problem. What is going on with this article? Rails3.2からRails4.2に上げたらActiveRecordが遅くなったので、どうやって調査して、どのように対処したかを語ってみたい。 とても長いので、ダルい人は最初と最後だけ読めばよいです。 TL;DR 環境: Ruby 2.1.5 ARオブジェクトを大量に(ざっくり750kくらい)loadするバッチ処理 3.2系での実行時間は約480sec、 4.2系では約2900sec 約6倍の性能劣化 原因: preloadで性能劣化してた CollectionProxyの生成周りで遅くなってた Rails4からARオブジェクトの1attribute毎にObject生成するので遅い GCの時間も増えた 調査方法: Githubのcommit、Issueを
整理 まず、ここまでで一旦整理する。 Time.nowはRubyの組み込みなのでシステムのタイムゾーンしか見ない。OSの時間と常に一致する。Time.localの出力結果もOSのタイムゾーンと一致する。 TimeWithZoneクラスはconfig.time_zoneに左右される。 Ruby組み込みのメソッドで取得したUTCの時間を基準に、設定されているタイムゾーンの時間に変換する。 ActiveRecordのインスタンスに対してアクセサを利用して時間をやり取りする場合はTimeWithZoneで行われる。 仮にTimeクラスを渡しても代入時にTimeWithZoneに変換される。 config.active_record.default_timezoneの設定はDBを読み書きする際に、DBに記録されている時間をTime.utcで読むかTime.localで読むかを設定する。 :utcの場
unicornに代表されるprefork(する)サーバでは、DBへのコネクションのような各プロセスで共有してはいけないリソースをbefore_forkとafter_forkで適切に管理する必要がある。 ふつうのRails Applicationは以下のように、ARのコネクションをはりなおしていると思う。 before_fork do |server, worker| ActiveRecord::Base.connection.disconnect! end after_fork do |server, worker| ActiveRecord::Base.establish_connection end しかし、Octopusを使っている場合はこれだけでは不十分で、このままだと再起動直後にエラーが大量に出ることになる。今関わっているプロジェクトではNoMethodError: undefi
Rails 4.0からActiveRecordにstrict_modeが導入され、デフォルトでは接続時にsql_mode = STRICT_ALL_TABLESをセットするようになりました。 これは、既に運用されているDBに接続する等なんらかの理由でMySQL側で適切な設定が行えていない場合有用な動作ですが、そうでない場合、サーバー側の設定を鑑みずにクライアント側が設定を上書きするべきではないでしょう。 そのため、database.ymlでstrict: falseと設定することでこの動作を無効にすることができましたが、Rails 4.2.0ではこの動作が変更され、strict: falseのときはstrictでない状態にするためsql_mode = ''をセットするようになりました。 MySQLのデフォルトのsql_modeに依存して既に通っていたはずのテストが通らなかったりすることがあ
ADSL - Abstract Data Store Library Project maintained by Bocete Hosted on GitHub Pages — Theme by mattgraham ADSL - Abstract Data Store Library ADSL is a gem for formal verification of Ruby on Rails models. Simply include it in your Gemfile, write a few invariants (rules) about ActiveRecord data that you wish to verify (for example, that at any given moment, every Address has a User) and run rake
This domain may be for sale!
It looks like Nick Kallen’s wildly popular has_finder plugin will be making its way into Rails 2.x in the form of named_scope. Observe: class User < ActiveRecord::Base named_scope :active, :conditions => {:active => true} named_scope :inactive, :conditions => {:active => false} named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } } end # Standard usage User.active # same
パターン名と実装名に同じ物が多くてややこしいので、P:パターン、I:実装とする。以下は(※1)、勉強会での話あるいは舞波の認識であるので実際と違っている可能もあり、それによって万が一あなたが被害をどーのーこーの(ry ActiveRecordパターン テーブルとクラスを1:1に対応させるパターン。勉強会参加者はAR(I)に当然馴染みがあるので省略。 DataMapperパターン AR(P)とDM(P)は凄く似ている。パターンとしての違いは、 ARのマッピングは1:1だが、DMは1:n (オブジェクトから見てテーブルをコンポジット可能) DMはスキーマ定義を持つ である。実装的には、AR(I)は機能2をマイグレーションとして持つため、マッピングが1:1であれば完全に同一だと言える。よって、以下のややこしい結論を得る。 AR(P)≠DM(P) であるが AR(I)≒DM(P) てことで、Dat
● [Rails] ScopedAccess ScopedAccess プラグインを更新しました。実は今までは production モードでは正しく動かなかったのですが、今回の修正で使えるようになったはずです。 [修正点] dispatcher でリクエスト毎に AR.scoped_methods をクリア Filter#before で条件をキャッシュしてた不具合を修正 (thanks to Nikhil) method_scoping 中の MethodScoping を ClassScoping に自動変換 ※ 1,2 は production への対応です。 [svn] http://wota.jp/svn/rails/plugins/branches/stable/scoped_access [使い方] コードはいつもと一緒 class BlogController < App
昨日のmysqlarに、『恋とハックはアジャイルが命!』で有名なかずひこさんがpatchを書いて下さり、かつiar (Interactive ActiveRecord) というキャッチーな名前をつけてくれました。名前重要! MySQLじゃないと動かないかなー、と思ってたんですが、adapter差し替えただけで他でも普通に動くよ!というわけでsqliteやpostgresqlなんかでも動きます。他にもfirebird sqlserverでも動くかも。 起動は iar -a sqlite -t db/development.db なんかで。特にsqliteの対話インターフェイスは貧弱なのでかなり嬉しいかも。ソースは http://rails2u.com/misc/iar.txt に置いておきました。 で、ちょっとした irb tips。通常 irb では戻り値のinspectした値を表示してく
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く