I am using Rails Fixtures to load some test data to my database and
accidentally I introduced a foreign key out of range.
To my surprise, the database accepted it despite having referential
integrity constraints (that work). I tried with PostgreSQL and with
MySQL InnoDB and both allowed.
Example:
Having in the database "Flavours" whith a numeric primary key (id), 5
entries (1 to 5). I can introduce bad data doing:
Icecream_1:
name: my ice cream
flavour_id: 6
How is it possible that the fixtures loading go around my database
constraints?
How is it possible that the fixtures loading go around my database
constraints?
For PostgreSQL AFAIK, the triggers which enforce RI are disabled prior
to the loading of the fixtures. I only discovered this because I ran
into a problem recently where my tests were failing because the db user
for the tests did not have permissions to disable the triggers.
Oh, right...I remember seeing that (I think it's a performance hack?).
Yet another reason not to use fixtures, arguably the most broken and
horrific feature of Rails. Jaime, I would *highly* recommend abandoning
fixtures and using factories for your testing instead (I like Machinist
for this). Your tests will be easier to write and more conceptually
correct.