2007年12月13日

":include"を試してみます。

昨日の文末に書いた":include"を試してみます。
以下のようにfindメソッドにオプションとして渡すようです。

@denpyo = Denpyo.find(params[:id], :include=>:denpyo_meisais)

で、実行してみると以下のようなSQLを実行しました。
いい感じいい感じ♪。。。って駄目じゃん!

SELECT denpyos.`id` AS t0_r0, denpyos.`denpyo_no` AS t0_r1, denpyos.`shohin_sum` AS t0_r2,
denpyos.`kingaku_sum` AS t0_r3, denpyos.`denpyo_date` AS t0_r4, denpyo_meisais.`id` AS t1_r0,
denpyo_meisais.`denpyo_no` AS t1_r1, denpyo_meisais.`meisai_no` AS t1_r2,
denpyo_meisais.`shohin_name` AS t1_r3, denpyo_meisais.`suryo` AS t1_r4,
denpyo_meisais.`kingaku` AS t1_r5
FROM denpyos
LEFT OUTER JOIN
denpyo_meisais ON denpyo_meisais.denpyo_no = denpyos.id # ←駄目じゃんな箇所
WHERE (denpyos.`id` = 1)

結合条件は、"denpyo_meisais.denpyo_no = denpyos.denpyo_no"となってほしかったのですが、Railsのポリシーとして、「参照先はPKでなくちゃ」という強固な縛りがあるようです。

一応、以下のサイトにあるようなカスタマイズをRailsに行えば、参照先列を指定できるようにすることも可能のようです。
http://wota.jp/ac/?date=20061119

「レールの外は修羅の道」合掌。。。猫
posted by 台北猫々 at 19:30| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

PK以外の列同士でリレーションを張ってみましょう。

PK以外の列(伝票番号)同士でリレーションを張ってみましょう。

has_manyには複数形を指定して、belongs_toには単数形を指定するのがミソです。この辺は作成者のこだわりを感じますね。

class Denpyo < ActiveRecord::Base
has_many :denpyo_meisais, :foreign_key => 'denpyo_no'
end

class DenpyoMeisai < ActiveRecord::Base
belongs_to :denpyo, :foreign_key => 'denpyo_no'
end

として、以下のような処理をしてみます。ここで、ステップ実行させてみました。findメソッドの呼び出し時点でテーブル結合しているのかと思っていましたが、違うようですね。

@denpyo = Denpyo.find(params[:id])
flash[:notice] = @denpyo.denpyo_meisais[0].kingaku #ここで、↓のSQLが実行されます。

[0;1mSELECT * FROM denpyo_meisais WHERE (denpyo_meisais.denpyo_no = 1)

ただ、これでは件数が増えた時に、ネットワークやDBのオーバーヘッド的に「正気ですか?」という感じなので、さらに調べてみると:includeオプションというのがあるらしいです。
posted by 台北猫々 at 00:19| Comment(0) | TrackBack(0) | 技術メモ(Ruby)