开发者

In a Rails unit test, how can I get a User fixture to load its associated Profile?

开发者 https://www.devze.com 2022-12-24 08:47 出处:网络
In the documentation concerning Fixtures (http://api.rubyonrails.org/classes/Fixtures.html) they provide the following example of using label references for associations:

In the documentation concerning Fixtures (http://api.rubyonrails.org/classes/Fixtures.html) they provide the following example of using label references for associations:

### in pirates.yml
reginald:
  name: Reginald the Pirate
  monkey: george

### in monkeys.yml
george:
  name: George the Monkey
  pirate: reginald

So following their 开发者_运维知识库lead, I have a User model that has_one :profile, a Profile model that belongs_to :user, and tried to set up fixtures per their example:

### in users.yml
reginald:
  id: 1
  login: reginald

### in profiles.yml
reginalds_profile:
  id: 1
  name: Reginald the Pirate
  user: reginald

(Note: since my association is one-way, the User fixture doesn't have a "profile: reginalds_profile" association--putting it in causes an error because the SQL table has no profile_id attribute.)

The problem is, in my unit tests everything seems to load correctly, but users(:reginald).profile is always nil. What am I missing?


Based on tadman's suggestion I did some more searching and found the answer elsewhere on this site, so I might as well post it.

See post titled Automatic associations in ruby on rails fixtures

Apparently the way Rails finds associated fixtures when you use labels (user: reginald) instead of IDs (user_id: 1) is by hashing the name and assuming the hash is the ID. If you set the ID to something specific, this fails. But if you let Rails automatically assign IDs it uses that hashing scheme. So the documentation for fixture association labels is missing a key tidbit--if you are using labels you must avoid applying your own IDs in the fixtures to be matched. Fixtures not being matched by labels can still have whatever ID scheme you choose.


You may have to declare that you're loading all of these fixtures as I do not believe the fixture loader follows associations like this automatically. In some cases you may have to do more than simply:

fixtures :all

Actually declaring each of them:

fixtures :users, :profiles
0

精彩评论

暂无评论...
验证码 换一张
取 消