忍者ブログ
ブログツール、2007/11/06作成
[7] [6] [5] [4] [3] [2] [1
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

AR.findの:includeオプションでハマる。

これまであまりにパフォーマンス無視で作ってきたのを反省して、SQLの発行回数を減らすために:includeオプションを多用してみた。
そしたら、Modelクラスで:order宣言しているときにSQLエラー発生。
エラーをみるに、order指定しているカラムは使えん、とのこと。

はじめ、:order指定するためのカラム名を安直にorderにしてしまったため、SQLの予約語とかぶったんだと思い、シングルクオートで囲んだりいろいろやってみるもいずれも失敗。
さらにカラム名をdisplay_orderとかにしてみてもだめ。

結局、回避策はModelクラスの :orderオプションにテーブル名のプレフィックスをつけることでした。orz
こんな感じ

class Hoge
has_many :fugas, :order="fugas.display_order"
end

class Fuga
belogns_to :hoge
end
こうしたものの、多重has_many関連の途中だと失敗しちゃう。
例:
class Hoge
has_many :fugas, :order=>'fugas.desplay_order'
end

class Fuga
belogns_to :hoge
has_many :piyos, :order=>'piyos.display_order'
end

class Piyo
belongs_to :Fuga
end
このとき、
コントローラで
hoge = Hoge.find(id, :include=>{:fuga=>:piyo})
とやったときは問題ない。
fuga = Fuga(id, :include=>:piyo)
とやったときもOK。
ところが、
hoge = Hoge.find(id, :include=>{:fuga=>:piyo})
とやって、
fuga = hoge.fugas.find(fuga_id, :include=>:piyo)
とやるとSQLエラーが。

ARのソースでも読めばわかるんだと思うけど、なかなかそこまでの根性が入りまへん。
あきらめて結局、
fuga = Fuga.find(fuga_id, :include=>:piyo)
とやってしまった。

とほほ。
PR
この記事にコメントする
name
title
color
mail
URL
comment
pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
secret (チェックを入れると管理人だけに表示できます)
この記事へのトラックバック
この記事にトラックバックする:
ついめ~じ
ブログ内検索
フリーエリア
サニーカメラ
Powered by Ninja Blog    template by Temp* factory    icon by MiniaureType

忍者ブログ [PR]