Smart Segments
This is the official documentation of the agent_ruby Ruby agent.
Smart Segments should be quick to migrate, as the syntax is very similar to the legacy agent.
How to migrate
Structure
Because the new Forest Admin agent is designed to work with multiple databases, the return value of the filter function is not a Sequelize or Mongoose condition anymore.
Instead, you'll be building a condition tree that will be translated to the appropriate database syntax by the agent.
Performance
All queries cannot be expressed in the Forest Admin query interface, but many can.
You can have great performance improvements by using the Forest Admin query interface to build your conditions, instead of performing the query yourself, and then building a naive condition tree, which filters by primary key like in the example we're providing.
Example
In this example, we migrate a segment that returns the 5 bestsellers of a product collection.
class Forest::Product
  include ForestLiana::Collection
  collection :Product
    segment 'Bestsellers' do
      query = <<~SQL
        SELECT products.id, COUNT(orders.*)
        FROM products
        JOIN orders ON orders.product_id = products.id
        GROUP BY products.id
        ORDER BY count DESC
        LIMIT 5;
      SQL
      products = ActiveRecord::Base.connection.execute(query)
      { id: products.map { |product| product['id'] } }
    end
endmodule ForestAdminRails
  class CreateAgent
    def self.setup!
      @create_agent.customize_collection('product') do |collection|
        collection.add_segment('best_sellers') do |context|
          rows = ActiveRecord::Base.connection.execute(
            'SELECT products.id as product_id, COUNT(orders.id) as nb
             FROM products
             INNER JOIN orders ON orders.product_id = products.id
             GROUP BY products.id
             ORDER BY nb DESC
             LIMIT 5;'
          )
          {
            field: 'id',
            operator: 'In',
            value: rows.map { |r| r['product_id'] }
          }
        end
      end
    end
  end
endLast updated
Was this helpful?
