April 19, 2006

Railsにおけるリレーションシップの不思議

例えば、こんなの。


Class User < ActiveRecord::Base
has_many :teams
has_many :joinings
end

Class Team belongs_to :user
has_many :joinings
end

Class Joining < ActiveRecord::Base
belongs_to :user
belongs_to :team
end

つまり、ユーザがいる。チームが複数ある。で、チームにはオーナである、ユーザとの関連をもつ。これをUserクラスとTeamクラス間の1対多関連で表現する。
また、各チームと、各メンバの所属関係をJoiningというクラスでモデル化する。つまり、JoiningクラスとUserクラス間に1対多、JoiningクラスとTeamクラス間に1対多の関連を設定する。
本当は、TeamとUser間で、所有という関連と、参加という関連の2種類を持ちたかったんだけど、同じテーブル間で複数の種類の関連を設定することはRailsでは想定されていないっぽい(ひょっとして可能なのかな?)ので、苦肉の策として、Joiningというモデルを導入した次第。

1. ユーザ XXXが Teamインスタンス、team1を生成する。
当然、team1インスタンスのuser_id属性には、ユーザXXXのIDが入る。
2. 次に、ユーザYYYがteam1に参加する。
  この場合、Joiningインスタンスを生成し、それぞれ、team1のIDとユーザYYYのIDをもつインスタンスとなる
3. この生成したインスタンスをDBに保存すると、なぜか、team1のユーザID(つまりオーナ)がユーザYYYに書き換えられる。

うーん、なぜ?

Posted by money at 2:50 PM | Comments (2) | TrackBack

April 6, 2006

これは正しい?

RailsのHTML生成でいまいち納得いかない点・・・

<%= check_box("AAA","bbb","onclick"="hogehoge") %>

と記述したビューのRHTMLから生成されたHTMLのコードが、

<input id="AAA_bbb" name="AAA[bbb]" onclick="hogehoge" type="checkbox" value="1" /><input name="AAA[bbb]" type="hidden" value="0" />

って正しいのかなぁ。。。
オブジェクトAAAのbbb()メソッドの値に応じて、チェック/非チェックになって欲しいのだが、なってくれん。

ちなみに、Rails1.1 っす。

Posted by money at 2:58 PM | Comments (2) | TrackBack

外部参照制約 on Rails

DBのスキーマレベルで、CONSTRAINT FOREIGN KEYを指定してると、Railsのモデルをユニットテストするのがしっちゃかめっちゃかになるのはどうしようもないんだろうか。

素直に、ODBっぽく、リレーショナルスキーマを意識せずに、リレーションシップを使いたいだけなんだが。


外部キー制約、参照整合性

外部キー制約付けない派が大多数。なるほど。確かに実務上は付けないほうがよさそうではあるのだけど。ちょっと意外ではあった。
(〜 via Csus4.net - Just example. 〜)

という説もあるけど、確かになぁ。。。

なんか、いい方法ありませんか?

Posted by money at 3:53 AM | Comments (1) | TrackBack