2008/10/07

has_many throughのFixtureがつながらない

has_many throughなAssociationをもつテーブル用のFixtureを書いたが、関連先のデータがどうしても0件になる。

モデルはこんなの

class User < ActiveRecord::Base has_many :calendars, :through => :access_controls has_many :access_controls  ・・・ end class Calendar < ActiveRecord::Base has_many :schedules has_many :access_controls has_many :users, :through => :access_controls ・・・ end class AccessControl < ActiveRecord::Base belongs_to :user belongs_to :calendar  ・・・ end

Fixtureはこんなの

# users.yml user1 : name: user password: password nickname: user first_name: first_name last_name: last_name email: user@example.com # calendars.yml calendar1: id: 0 name: calendar1 public: true calendar2: name: calendar2 public: false calendar3: name: calendar3 public: false calendar4: name: calendar4 public: false calendar5: name: calendar5 public: false # access_controls acl1: user_id: user1 calendar_id: calendar1 control: <%= AccessControl::ALL %> acl2: user_id: user1 calendar_id: calendar2 control: <%= AccessControl::ALL %> acl3: user_id: user1 calendar_id: calendar3 control: <%= AccessControl::READONLY %> acl4: user_id: user1 calendar_id: calendar4 control: <%= AccessControl::UPDATE %> acl5: user_id: user1 calendar_id: calendar5 control: <%= AccessControl::NO_AUTHORITY %>

でもってテストコード

describe User do fixtures :users, :calendars, :access_controls it "should have 5 calendars" do user = users(:user1) user.calendars.should have(5).items end

その結果

1) 'User should have 5 calendars' FAILED expected 5 items, got 0

全テーブルをFindしてppしてみたら、access_controlのuser_idとcalendar_idが全て0になっている。でも、自動生成されるUserのIDは30万とか。そりゃ0件になる。

いろいろぐぐって見たら、AssociationテーブルのFixtureは_idをつける必要はないらしい。要はuser_idじゃなくて、userにしろと。

#access_controls.yml acl1: user: user1 calendar: calendar1 control: <%= AccessControl::ALL %> acl2: user: user1 calendar: calendar2 control: <%= AccessControl::ALL %> acl3: user: user1 calendar: calendar3 control: <%= AccessControl::READONLY %> acl4: user: user1 calendar: calendar4 control: <%= AccessControl::UPDATE %> acl5: user: user1 calendar: calendar5 control: <%= AccessControl::NO_AUTHORITY %>

で、めでたく動いた。なぜ0にするんだorz
悩ましすぎる。

0 件のコメント: