Rails3いろいろ

震災後くらいからいじり初めて、Rails3の案件を一つやって、今はRails3.1の案件が進行中。

何と言ってもArel最高。Perl/DBIの頃作ろうとしてうまくできなかったものが実現されている感じ。 オブジェクト志向にどっぷり浸かっている時にSQLで突然手続き志向に戻されるのが嫌だったんだよね。 極力SQL書かないようにしてやってるけど、NOT INとか!=とか否定が入るとどうしてもSQLの断片を書かなくちゃならないのが不満ではあります。

以下、よくハマるところ。

scopeを使って

scope :recent, where("created_at > ?", 1.day.ago)

とかやりたくなるんだけどこれは罠。scopeは生成された時点で評価されるので、production環境だと起動時の1日前になってしまう。 lambdaを使って

scope :recent, lambda { where("created_at > ?", 1.day.ago) }

が正解。

あとdefault_scopeはよく考えてから使った方がいい。 明示的に外さない限り外れないので、むしろ「うっかりロードしたらまずいデータの排除(論理削除とか)」に使うのが正解な気がする。軽い気持ちでorderとか付けておくとfirstとlastがごっちゃになってわけ分からなくなる。