Databases allow bad foreign keys from Rails Fixtures


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.


Having in the database "Flavours" whith a numeric primary key (id), 5
entries (1 to 5). I can introduce bad data doing:

    name: my ice cream
    flavour_id: 6

How is it possible that the fixtures loading go around my database

Thank you.

Hi Jaime,

Thank you Tony.

Mistery solved, looks like there is nothing to worry about, I only have
to be careful loading the test data.

Tony Byrne wrote:

Hi Jaime,

How is it possible that the fixtures loading go around my database

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


Tony Byrne.


Thanks Marnen.

Rails has a lot to improve, especially in the relational database area
but I think it's in the right way.

I will check out Machinist as you recomend.