# Segments

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

A Segment is a subset of a Collection: it's a saved filter of your Collection.

Segments are designed for those who want to *systematically* visualize data according to specific sets of filters. It allows you to save filter configurations so user don’t have to do repetitive actions every day.

![](https://561307319-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fn23xpsrpC8uJXljJ3an2%2Fuploads%2Fgit-blob-b91265b079fd224c5918e2e8fabdee9d1f92d6c4%2Fsegment-example.png?alt=media)

## From your admin panel

Segments can be configured from the interface, without the need to write any code.

This is documented in the [User Guide](https://docs.forestadmin.com/user-guide/collections/segments).

## From your Agent

Sometimes, Segment filters are complicated and closely tied to your business. Forest Admin allows you to code how the Segment is computed.

For instance, in our [Live Demo example](https://app.forestadmin.com/livedemo), we’ve implemented a Segment on the collection `products` to allow admin users to see the bestsellers at a glance.

### Example

The only requirement when implementing a Segment from your agent is to return a valid `ConditionTree`.

#### Traditional Syntax

Using full context methods with `customize_collection`:

```ruby
include ForestAdmin::Types

@create_agent.customize_collection('customer') do |collection|
  collection.add_segment('mostPurchased') do |context|
    rows = context.datasource.get_collection('order').aggregate(
      Filter.new,
      Aggregation.new(operation: 'Count', groups: [{ field: 'product_id' }]),
      10
    )

    {
      field: 'id',
      operator: Operators::IN,
      value: rows.map { |r| r['product_id'] }
    }
  end
end
```

#### DSL Syntax

Using simplified DSL with `collection`:

```ruby
@create_agent.collection :customer do |collection|
  collection.segment 'mostPurchased' do |context|
    rows = context.datasource.get_collection('order').aggregate(
      context.caller,
      Filter.new,
      Aggregation.new(operation: 'Count', groups: [{ field: 'product_id' }]),
      10
    )

    {
      field: 'id',
      operator: 'In',
      value: rows.map { |r| r['product_id'] }
    }
  end
end
```
