Computed foreign keys
Displaying a link to the last message sent by a customer
include ForestAdmin::Types
@create_agent.customize_collection('customer') do |collection|
# Create foreign key
collection.add_field(
'lastMessageId',
ComputedDefinition.new(
column_type: 'Number',
dependencies: ['id'],
values: proc { |customers, context|
customer_ids = customers.map { |r| r['id'] }
# We're using Forest Admin's Query Interface
filter = Filter.new(
condition_tree: ConditionTreeLeaf.new('customer_id', Operators::IN, customer_ids)
)
aggregation = Aggregation.new(operation: 'Max', field: 'id', groups: [{ field: 'customer_id' }])
rows = context.datasource.get_collection('message').aggregate(filter, aggregation)
customers.map do |customer|
row = rows.find { |r| r['group']['customer_id'] == customer['id'] }
row ? row['value'] : nil
end
}
)
)
.replace_field_operator('lastMessageId', Operators::IN) do |last_message_ids, context|
filter = Filter.new(
condition_tree: ConditionTreeLeaf.new('id', Operators::IN, last_message_ids)
)
records = context.datasource.get_collection('message').list(filter, Projection.new(['customer_id']))
{ field: 'id', operator: 'In', value: records.map { |r| r['customer_id'] } }
end
.add_many_to_one_relation('lastMessage', 'message', { foreign_key: 'lastMessageId' })
endConnecting collections without having a shared identifier
Last updated