Scope on a smart field extracting a json's column attribute
Context: As a user, I want to scope a table's records based on the value of an attribute nested within a json column.
Example: I have a table users that includes a JSONB column named contact. The contact json can include a phone, email or country attribute. Since I want to scope my collection by country, I created a smart field called country that returns the value of the country attribute and I implemented a filter feature for this field.

Implementation

The smart field definition and the filtering logic are defined as follows in the forest/users.js file of my admin backend.
1
const { collection } = require('forest-express-sequelize');
2
const models = require('../models');
3
4
const { Op } = models.objectMapping;
5
6
collection('users', {
7
actions: [],
8
fields: [{
9
field: 'country',
10
isFilterable: true,
11
type: 'String',
12
get: (record) => record.contact.country,
13
filter({ condition, where }) {
14
switch (condition.operator) {
15
case 'equal':
16
return {
17
'contact.country': { [Op.eq]: condition.value },
18
};
19
// ... And so on with the other operators not_equal, starts_with, etc.
20
21
default:
22
return null;
23
}
24
},
25
}],
26
segments: [],
27
});
Copied!
In order to make your smart field filterable in the UI, you both need to add the isFilterable: true option in the field's declaration and to enable filtering on this field in the field settings in the UI.
Copy link