Databases allow bad foreign keys from Rails Fixtures

Hi,

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?

Thank you.

Hi Jaime,

On 13 Aug 2010, at 11:49, Jaime Ferreira wrote:

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.

Regards,

Tony Byrne.

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,

On 13 Aug 2010, at 11:49, Jaime Ferreira wrote:

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.

Regards,

Tony Byrne.

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

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.