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
悩ましすぎる。