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 件のコメント:
コメントを投稿