# Populate Your Rails Database with Fixtures

Used: rails@6.0.0

Fixtures are a powerful way to populate your Rails database with sample data for testing and development purposes. In this tutorial, I'll show you how to create, load, and use fixtures in Rails.

## What are Fixtures?

Fixtures are YAML files used in Rails to provide predefined data for your models. They're commonly used in testing, but they can also be helpful for seeding your development database.

Fixtures are stored in the `test/fixtures` directory (or `spec/fixtures` if you're using RSpec).

## Creating Fixtures

Let's say you have a `User` model. You can create a fixture file for it at `test/fixtures/users.yml`:

```yaml {% path="test/fixtures/users.yml" %}
john_doe:
  name: John Doe
  email: john@example.com
  age: 30

jane_doe:
  name: Jane Doe
  email: jane@example.com
  age: 25
```

In this example, we've defined two users, `john_doe` and `jane_doe`.

Each entry in the YAML file represents a record with its attributes.

## Loading Fixtures into the Database

To load fixtures into your database, run the following command:

```bash
rails db:fixtures:load
```

This will load **all the fixtures** located in the `test/fixtures` directory into your development or test database.

### Loading Specific Fixtures

If you want to load a specific fixture, use the `FIXTURES` option. For example, to load only the `users` fixture:

```bash
rails db:fixtures:load FIXTURES=users
```

## Using Fixtures in Tests

In your tests, you can easily access the fixtures using the fixture names. Rails automatically loads fixtures before each test case.

Here's an example test using fixtures:

```ruby {% path="test/models/user_test.rb" %}
require "test_helper"

class UserTest < ActiveSupport::TestCase
  test "user fixture is valid" do
    user = users(:john_doe)
    assert user.valid?
  end
end
```

In this test, `users(:john_doe)` retrieves the `john_doe` fixture.

## Using Associations in Fixtures

You can also define associations in fixtures by referencing other fixtures by name. Here's an example for a `Post` model:

```yaml {% path="test/fixtures/posts.yml" %}
first_post:
  title: My First Post
  body: This is the first post.
  user: john_doe
```

In this example, the `user` attribute links to the `john_doe` fixture in `users.yml`.

## Best Practices

- **Use meaningful names** for your fixture keys (e.g., `john_doe` instead of `user1`).
- **Keep fixtures up-to-date** with your schema.
- **Don’t use fixtures for production data**. For production, use `db/seeds.rb`.

## Conclusion

Fixtures are a quick and easy way to populate your database with sample data for tests and development. By understanding how to create and load fixtures, you can streamline your testing process and keep your sample data organized.
