Overview
To scope a report to a specific record (e.g. to show a report about a specific user), use a Contextual Filter.
For example, let's say that you want to create a report of the weekly Posts by a specific Author. You would add a contextual_filter
to the Post model:
# app/models/post.rb
class Post < ApplicationRecord
include ReportsKit::Model
reports_kit do
contextual_filter :for_author, ->(relation, context_params) { relation.where(author_id: context_params[:author_id]) }
end
end
Then specify that contextual_filter
in the YAML:
measure: post
contextual_filters:
- for_author
dimensions:
- created_at
And set the context_params
that will be passed to it in the view:
= render_report 'my_report', context_params: { author_id: current_user.id }
N.B. The context_params
will be passed from the client to the server when the report's data is generated. If you need to do server-side validation of them, you can do so using context params validation.
To create the chart above, simply add the following YAML file and call render_report
in any view:
YAML
config/reports_kit/reports/contextual_filters.yml
measure: post contextual_filters: - for_author dimensions: - created_at
View
app/views/my_controller/my_view.html.haml
= render_report 'contextual_filters', context_params: { author_id: current_user.id }
Model
app/models/post.rb
class Post < ApplicationRecord belongs_to :author has_many :post_views, dependent: :destroy has_many :posts_tags, dependent: :destroy has_many :tags, through: :posts_tags include ReportsKit::Model reports_kit do aggregation :average_time_to_publish, [:average, 'posts.published_at - posts.created_at'] contextual_filter :for_author, ->(relation, context_params) { relation.where(author_id: context_params[:author_id]) } dimension :approximate_views_count, group: 'ROUND(posts.views_count, -1)' filter :is_published, :boolean, conditions: ->(relation) { relation.where(status: 'published') } end STATUSES = %w(draft private published).freeze def to_s title end end
Model's Columns
id integer author_id integer title string status string published_at datetime is_featured boolean views_count integer created_at datetime updated_at datetime