# Override sorting behavior

{% hint style="success" %}
This is the official documentation of the `agent_ruby` Ruby agent.
{% endhint %}

Depending on the data source, not all fields may be sortable, or you may want to change how the native sorting works.

By using the `replace_field_sorting` and `emulate_field_sorting` methods, you can change a single column's sorting behavior.

#### Substitution

You can also provide replacement sort clauses. In this example, we're telling Forest Admin "When a user sorts by full name, I want to sort by the last name, and then by the first name".

#### Traditional Syntax

Using full context methods with `customize_collection`:

```ruby
@create_agent.customize_collection('customer') do |collection|
  collection.replace_field_sorting('fullName', [
    { field: 'lastName', ascending: true },
    { field: 'firstName', ascending: true },
  ])
end
```

#### DSL Syntax

Using simplified DSL with `collection`:

```ruby
@create_agent.collection :customer do |collection|
  collection.replace_sorting :fullName, [
    { field: 'lastName', ascending: true },
    { field: 'firstName', ascending: true }
  ]
end
```

Another very common reason is performance. For instance, with auto-incrementing ids, sorting by `creationDate` is equivalent to sorting by the primary key in reverse order.

Using sort substitution where needed can save you from adding many indexes to your database.

#### Traditional Syntax

Using full context methods with `customize_collection`:

```ruby
@create_agent.customize_collection('customer') do |collection|
  collection.replace_field_sorting('creationDate', [{ field: 'id', ascending: false }])
end
```

#### DSL Syntax

Using simplified DSL with `collection`:

```ruby
@create_agent.collection :customer do |collection|
  collection.replace_sorting :creationDate, [{ field: 'id', ascending: false }]
end
```

#### Emulation

Sorting emulation allows making any field automatically sortable. It will sort records by lexicographical order. It is a convenient way to get things working quickly for Collections that have a low number of records (in the thousands at most).

{% hint style="warning" %}
This emulation forces the Agent to retrieve all the Collection records and compute the field values for each one of them. As a consequence, sorting emulation performance cost is **linear** with the number of records in the Collection, so **activate it sparingly and with great care**.
{% endhint %}

#### Traditional Syntax

Using full context methods with `customize_collection`:

```ruby
@create_agent.customize_collection('customer') do |collection|
  collection.emulate_field_sorting('fullName')
end
```

#### DSL Syntax

Using simplified DSL with `collection`:

```ruby
@create_agent.collection :customer do |collection|
  collection.emulate_sorting :fullName
end
```
