SlideShare a Scribd company logo
1 of 48
Download to read offline
Filtering,	Searching,	and	Sor1ng	
Ac1veRecord	Lists	Using	Filterrific	
Waihon	Yew	
GitHub	(waihon)	
TwiCer	(@waihon)
Searching	for	a	Gem
What	Does	Filterrific	Provide?	
•  Let	your	app's	users	search,	filter	and	sort	lists	of	
Ac1veRecord	objects.	
•  Persist	filter	seOngs	in	the	HTTP	session	or	DB.	
•  Integrates	with	pagina(on	(will_paginate	or	
kaminari).	
•  Reset	filter	to	default	seOngs.	
•  Relies	on	Ac1veRecord	scopes.	
•  ShuCles	filter	seOngs	from	a	filter	UI	to	the	
controller	and	Ac1veRecord.	
•  Can	be	used	for	HTML/JSON/JS/XML	response	
formats.	
•  Documenta1on:	hCp://filterrific.clearcove.ca/
Dependencies	
•  Rails	and	Ac1veRecord	3.x	and	above.	
•  jQuery	and	asset	pipeline	for	form	observers	
and	spinner.
What	You	Have	To	Do?	
1.  Define	Ac1veRecord	scopes.	
2.  Build	and	style	your	filter	form	and	record	
lists.
•  A	web	app	that	stores	basic	informa1on	of	
students.	
Demo	App	-	ERD	
has_many	
belongs_to
Demo	App	–	Base	
	
hCps://github.com/jhund/filterrific_demo	
hCp://filterrific-demo.herokuapp.com/
Demo	App	–	Enhanced	
hCps://github.com/waihon/filterrific_demo
Short	Demo	of	the	Enhanced	App
Gemfile	
gem "filterrific"
View	
•  Display	the	form	to	update	filter	seOngs.	
•  Display	the	list	of	matching	records.	
•  Update	the	filter	seOngs	via	AJAX	form	
submission.	
•  Reset	the	filter	seOngs.	
•  Filterrific	works	best	with	AJAX	updates.		
•  The	library	comes	with	form	observers	for	
jQuery	and	an	AJAX	spinner.
View	Components
View	Components	
index.html	
This	is	the	main	template	for	the	
students	list.		
It	is	rendered	on	first	load.
View	Components	
index.html	
																				students/_list.html	
This	par1al	renders	the	actual	list	of	
students.		
It’s	extracted	into	a	par1al	so	that	it	can	
be	updated	via	AJAX	response.
View	Components	
index.html	
																				students/_list.html	
form_for_filterrific	
Filterrific	adds	the	'form_for_filterrific'	view	helper:	
*	Adds	DOM	id	'filterrific_filter'	
*	Applies	Javascript	behaviors:	
				-	AJAX	form	submission	on	change	
				-	AJAX	spinner	while	AJAX	request	is	being	processed	
*	Sets	form_for	op1ons	like	:url,	:method	and	input	
name	prefix
View	Components	
index.html	
																				students/_list.html	
form_for_filterrific	
Give	the	search	field	the	
'filterrific-periodically-observed'	
class	for	live	updates.
View	Components	
index.html	
																				students/_list.html	
form_for_filterrific	
index.js	
This	JavaScript	updates	the	students	
list	aher	the	filter	seOngs	were	
changed.
View	Components	
index.html	
																				students/_list.html	
form_for_filterrific	
index.js	
Searches/_modal_form.html	
Display	a	modal	form	for	saving	
filter	seOngs.
View	Components	
index.html	
																				students/_list.html	
form_for_filterrific	
index.js	
searches/_list.html
View	Components	
index.html	
																				students/_list.html	
form_for_filterrific	
index.js	
searches/_list.html	
Reset	filter	seOngs	to	the	defaults	
defined	in	the	model	or	overriden	in	
the	controller	(reset_filterrific_url).
Sort	by	Column	Title	
Filterrific	provides	sortable	column	header	links	which	
toggle	sort	direc1on	with	the	filterrific_sor1ng_link()	
method.
Sort	by	Column	Title	
The	method	must	be	placed	in	the	_list.html	view	par1al:	
<th><%= filterrific_sorting_link(@filterrific, :name) %></th>
The	filterrific_sor1ng_link	method	is	expec1ng	a	sorted_by	scope	which	
contains	the	column	headers	and	the	model	aCribute	to	sort	by.		
Column	headers	are	automa1cally	capitalized.	
scope :sorted_by, lambda { |sort_option|
# extract the sort direction from the param value.
direction = (sort_option =~ /desc$/) ? 'desc' : 'asc'
case sort_option.to_s
when /^created_at_/
order("students.created_at #{ direction }")
when /^name_/
order("LOWER(students.last_name) #{ direction },
LOWER(students.first_name) #{ direction }")
when /^country_name_/
order("countries.name #{ direction }").includes(:country)
else
raise(ArgumentError, "Invalid sort option: #{ sort_option.inspect }")
end
}
Sort	by	Column	Title
Disable	AJAX	Auto	Form	Submits	
•  By	default	Filterrific	will	automa1cally	submit	the	filter	
form	as	soon	as	we	change	any	of	the	filter	seOngs.		
•  Some1mes	you	may	not	want	this	behavior,	e.g.,	if	the	
rendering	of	the	filtered	records	is	fairly	expensive.	
•  The	auto	submit	behavior	is	triggered	by	the	filter	
form's	id	which	is	automa1cally	added	by	the	
form_for_filterrific	helper	method.		
•  In	order	to	deac1vate	AJAX	auto	submits	
–  Override	the	DOM	id	for	the	form	with	something	other	
than	the	default	of	filterrific_filter.		
–  Add	the	remote:	true	op1on	to	form_for_filterrific	
–  Don't	add	the	.filterrific-periodically-observed	class	to	any	
inputs.		
–  Add	a	regular	submit	buCon
Disable	AJAX	Auto	Form	Submits	
•  By	default	Filterrific	will	automa1cally	submit	the	filter	
form	as	soon	as	we	change	any	of	the	filter	seOngs.		
•  Some1mes	you	may	not	want	this	behavior,	e.g.,	if	the	
rendering	of	the	filtered	records	is	fairly	expensive.	
•  The	auto	submit	behavior	is	triggered	by	the	filter	
form's	id	which	is	automa1cally	added	by	the	
form_for_filterrific	helper	method.		
•  In	order	to	deac1vate	AJAX	auto	submits	
–  Override	the	DOM	id	for	the	form	with	something	other	
than	the	default	of	filterrific_filter.		
–  Add	the	remote:	true	op1on	to	form_for_filterrific	
–  Don't	add	the	.filterrific-periodically-observed	class	to	any	
inputs.		
–  Add	a	regular	submit	buCon	
If	you	s1ll	want	to	submit	the	form	via	AJAX	(just	not	
automa1cally	on	every	change).		
Otherwise	the	form	will	be	submiCed	as	regular	POST	
request	and	the	en1re	page	will	reload.
Disable	AJAX	Auto	Form	Submits	
•  By	default	Filterrific	will	automa1cally	submit	the	filter	
form	as	soon	as	we	change	any	of	the	filter	seOngs.		
•  Some1mes	you	may	not	want	this	behavior,	e.g.,	if	the	
rendering	of	the	filtered	records	is	fairly	expensive.	
•  The	auto	submit	behavior	is	triggered	by	the	filter	
form's	id	which	is	automa1cally	added	by	the	
form_for_filterrific	helper	method.		
•  In	order	to	deac1vate	AJAX	auto	submits	
–  Override	the	DOM	id	for	the	form	with	something	other	
than	the	default	of	filterrific_filter.		
–  Add	the	remote:	true	op1on	to	form_for_filterrific	
–  Don't	add	the	.filterrific-periodically-observed	class	to	any	
inputs.		
–  Add	a	regular	submit	buCon	
<%= form_for_filterrific @filterrific, remote: true
html: { id: 'filterrific-no-ajax-auto-submit' } do |f| %>
...
<%= f.submit 'Filter' %>
<% end %>
Model	–	Add	filterrific	Direc1ve	
# student.rb
Filterrific(
default_filter_params:
{ sorted_by: 'created_at_desc' },
available_filters: [
:sorted_by,
:search_query,
:with_country_id,
:with_created_at_gte
]
)	
Define	default	filter	seOngs	
Specify	which	scopes	are	available	to	
Filterrific.	
This	is	a	safety	mechanism	to	prevent	
unauthorized	access	to	your	database.	
It’s	like	strong	parameters,	just	for	
filter	seOngs.	
Enable	Filterrific	for	the	Student	class
Model	–	Define	Select	Op1ons	
# student.rb
def self.options_for_sorted_by
[
['Name (a-z)', 'name_asc'],
['Registration date (newest first)',
'created_at_desc'],
['Registration date (oldest first)',
'created_at_asc'],
['Country (a-z)', 'country_name_asc']
]
End
# country.rb
def self.options_for_select
order('LOWER(name)').map { |e| [e.name, e.id] }
end
These	class	methods	
provide	op1ons	for	
select	drop-down	and	
are	called	in	the	
controller	as	part	of	
ini1alize_filterrific.
Model	–	Define	Scopes	
scope :sorted_by, -> { |sort_key|
# Sort students by sort_key
direction = (sort_key =~ /desc$/) ? 'desc' : 'asc’
...
}
scope :search_query, -> { |query|
# Filters students that matches the query
...
}
scope :with_country_id, -> { |country_ids|
# Filters students with any of the given country_ids
where(:country_id => [*country_ids])
}
scope :with_created_at_gte, -> { |ref_date|
# Filter students whom registered from the given date
where('students.created_at >= ?',
Date.strptime(ref_date, "%m/%d/%Y"))
}
Model	–	Define	Scopes	
scope :sorted_by, -> { |sort_key|
# Sort students by sort_key
direction = (sort_key =~ /desc$/) ? 'desc' : 'asc’
...
}
scope :search_query, -> { |query|
# Filters students that matches the query
...
}
scope :with_country_id, -> { |country_ids|
# Filters students with any of the given country_ids
where(:country_id => [*country_ids])
}
scope :with_created_at_gte, -> { |ref_date|
# Filter students whom registered from the given date
where('students.created_at >= ?',
Date.strptime(ref_date, "%m/%d/%Y"))
}	
Filterrific	relies	heavily	on	Ac1veRecord	scopes	for	filtering,	so	it	is	
important	that	you	are	familiar	with	how	to	use	scopes.	
hCp://filterrific.clearcove.ca/pages/ac1ve_record_scope_paCerns.html
Filterrific	Ac1onController	
•  Ini1alize	filter	seOngs	from	params,	
persistence	or	defaults.	
•  Execute	the	Ac1veRecord	query	to	load	the	
filtered	records.	
•  Send	the	Ac1veRecord	collec1on	to	the	view	
for	rendering.	
•  Persist	the	current	filter	seOngs.	
•  Reset	the	filter	seOngs.
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
Filterrific	lives	in	the	controller’s	index	ac1on.
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
An	Ac1veRecord-based	model	class.	
It	can	also	be	an	Ac1veRecord	rela1on.
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
Any	params	submiCed	via	web	request.	
If	they	are	blank,	filterrific	will	try	params	
persisted	in	the	session	next.	
If	those	are	blank,	too,	filterrific	will	use	the	
model's	default	filter	seOngs.
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
Store	any	op1ons	for	<select>	inputs	in	the	
form.	
The	key	refers	to	scope	name	defined	in	the	
model	
The	value	refers	to	method	defined	in	the	
model	that	return	an	array	of	op1ons
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
Defaults	to	"<controller>#<ac1on>"	string	
to	isolate	session	persistence	of	mul1ple	
filterrific	instances.	
Override	this	to	share	session	persisted	
filter	params	between	mul1ple	filterrific	
instances.		
Set	to	false	to	disable	session	persistence.
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
To	override	model	defaults
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
To	further	restrict	which	filters	are	
in	this	filterrific	instance.
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
This	method	also	persists	the	
params	in	the	session	and	handles	
reseOng	the	filterrific	params.
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
In	order	for	reset_filterrific	to	work,	it’s	
important	that	we	add	the	'or	return'	bit	
aher	the	call	to	'ini1alize_filterrific'.	
Otherwise	the	redirect	will	not	work.
Controller	–	ini1alize_filterrific	
# students_controller.rb
def index
@filterrific = initialize_filterrific(
Student,
params[:filterrific],
select_options: {
sorted_by: Student.options_for_sorted_by,
with_country_id: Country.options_for_select
}
persistence_id: 'shared_key',
default_filter_params: {},
available_filters: [],
) or return
@students = @filterrific.find.page(params[:page])
...
end	
This	method	also	persists	the	
params	in	the	session	and	handles	
reseOng	the	filterrific	params.	
Returns	an	Ac1veRecord	rela1on	
for	all	records	that	match	the	
filter	seOngs.	
We	can	paginate	with	
will_paginate	or	kaminari.	
The	rela1on	returned	can	be	
chained	with	other	scopes	to	
further	narrow	down	the	scope	of	
the	list,	e.g.,	to	apply	permissions	
or	to	exclude	certain	types	of	
records.
Saved	Searches	
•  @search.filter	=	session["shared_key"]	
•  @search.filter	=	session["students#index"]	
{"sorted_by"=>"created_at_asc",
"with_country_id"=>7,
"with_created_at_gte"=> "01/01/2016"}
Saved	Searches	
•  @search.filter	=	session["shared_key"]	
•  @search.filter	=	session["students#index"]	
{"sorted_by"=>"created_at_asc",
"with_country_id"=>7,
"with_created_at_gte"=> "01/01/2016"}
This	key	is	the	:persistence_id	
defined	in	the	call	to	
ini1alize_filteerrific	
This	key	is	the	:persistence_id	
defined	in	the	call	to	
ini1alize_filterrific
Ini1alize	Persisted	Filter	SeOngs	
•  In	the	call	to	ini1alize_filterrific,	replace	
params[:filterrific]	with	a	method	call.	
def filter_settings
if params[:filterrific].present?
params[:filterrific]
elsif params[:search_id].present?
search = Search.find_by(id: params[:search_id])
search ? eval(search.filter) :
Student.default_filter_params
else
Student.default_filter_params
end
end
# students_controller.rb
@filterrific =
initialize_filterrific(
Student,
filter_settings,
...
Ini1alize	Persisted	Filter	SeOngs	
•  In	the	call	to	ini1alize_filterrific,	replace	
params[:filterrific]	with	a	method	call	
def filter_settings
if params[:filterrific].present?
params[:filterrific]
elsif params[:search_id].present?
search = Search.find_by(id: params[:search_id])
search ? eval(search.filter) :
Student.default_filter_params
else
Student.default_filter_params
end
end
#routes.rb
get "/students/search/:search_id",
to: "students#index",
as: "search_students"
Ini1alize	Persisted	Filter	SeOngs	
•  In	the	call	to	ini1alize_filterrific,	replace	
params[:filterrific]	with	a	method	call	
def filter_settings
if params[:filterrific].present?
params[:filterrific]
elsif params[:search_id].present?
search = Search.find_by(id: params[:search_id])
search ? eval(search.filter) :
Student.default_filter_params
else
Student.default_filter_params
end
end
Using	eval	to	convert	the	persisted	
filter	seOngs	from	string	to	hash.
Thank	You	for	Your		
ACen1on	&	Pa1ence!	
Waihon	Yew	
GitHub	(waihon)	
TwiCer	(@waihon)

More Related Content

What's hot

Machine Learning with Spark MLlib
Machine Learning with Spark MLlibMachine Learning with Spark MLlib
Machine Learning with Spark MLlibTodd McGrath
 
Apache Spark - Introduccion a RDDs
Apache Spark - Introduccion a RDDsApache Spark - Introduccion a RDDs
Apache Spark - Introduccion a RDDsDavid Przybilla
 
OpenTSDB 2.0
OpenTSDB 2.0OpenTSDB 2.0
OpenTSDB 2.0HBaseCon
 
NGSIv2 Overview for Developers That Already Know NGSIv1
NGSIv2 Overview for Developers That Already Know NGSIv1NGSIv2 Overview for Developers That Already Know NGSIv1
NGSIv2 Overview for Developers That Already Know NGSIv1Fermin Galan
 
Introduction to Presto at Treasure Data
Introduction to Presto at Treasure DataIntroduction to Presto at Treasure Data
Introduction to Presto at Treasure DataTaro L. Saito
 
An Enterprise Architect's View of MongoDB
An Enterprise Architect's View of MongoDBAn Enterprise Architect's View of MongoDB
An Enterprise Architect's View of MongoDBMongoDB
 
Building an Authorization Solution for Microservices Using Neo4j and OPA
Building an Authorization Solution for Microservices Using Neo4j and OPABuilding an Authorization Solution for Microservices Using Neo4j and OPA
Building an Authorization Solution for Microservices Using Neo4j and OPANeo4j
 
Profiles and permission sets
Profiles and permission setsProfiles and permission sets
Profiles and permission setsVishesh Singhal
 
The Hyperledger Indy Public Blockchain Node
The Hyperledger Indy Public Blockchain NodeThe Hyperledger Indy Public Blockchain Node
The Hyperledger Indy Public Blockchain NodeSSIMeetup
 
SHACL in Apache jena - ApacheCon2020
SHACL in Apache jena - ApacheCon2020SHACL in Apache jena - ApacheCon2020
SHACL in Apache jena - ApacheCon2020andyseaborne
 
How to create a User Defined Policy with IBM APIc (v10)
How to create a User Defined Policy with IBM APIc (v10)How to create a User Defined Policy with IBM APIc (v10)
How to create a User Defined Policy with IBM APIc (v10)Shiu-Fun Poon
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBNodeXperts
 
Intro to Product Management and Business Model Canvas (BMC)
Intro to Product Management and Business Model Canvas (BMC)Intro to Product Management and Business Model Canvas (BMC)
Intro to Product Management and Business Model Canvas (BMC)Mulyadi Oey
 
Mulesoft meetup slides mumbai_20113019_exception_handling
Mulesoft meetup slides mumbai_20113019_exception_handlingMulesoft meetup slides mumbai_20113019_exception_handling
Mulesoft meetup slides mumbai_20113019_exception_handlingManish Kumar Yadav
 
Triplestore and SPARQL
Triplestore and SPARQLTriplestore and SPARQL
Triplestore and SPARQLLino Valdivia
 
Manejo de indicadores clave de desempeño (KPI) con Power BI
Manejo de indicadores clave de desempeño (KPI) con Power BIManejo de indicadores clave de desempeño (KPI) con Power BI
Manejo de indicadores clave de desempeño (KPI) con Power BIdbLearner
 

What's hot (20)

Machine Learning with Spark MLlib
Machine Learning with Spark MLlibMachine Learning with Spark MLlib
Machine Learning with Spark MLlib
 
Salesforce talk
Salesforce talkSalesforce talk
Salesforce talk
 
Syntaxe du langage PHP
Syntaxe du langage PHPSyntaxe du langage PHP
Syntaxe du langage PHP
 
Apache Spark - Introduccion a RDDs
Apache Spark - Introduccion a RDDsApache Spark - Introduccion a RDDs
Apache Spark - Introduccion a RDDs
 
OpenTSDB 2.0
OpenTSDB 2.0OpenTSDB 2.0
OpenTSDB 2.0
 
NGSIv2 Overview for Developers That Already Know NGSIv1
NGSIv2 Overview for Developers That Already Know NGSIv1NGSIv2 Overview for Developers That Already Know NGSIv1
NGSIv2 Overview for Developers That Already Know NGSIv1
 
Introduction to Presto at Treasure Data
Introduction to Presto at Treasure DataIntroduction to Presto at Treasure Data
Introduction to Presto at Treasure Data
 
An Enterprise Architect's View of MongoDB
An Enterprise Architect's View of MongoDBAn Enterprise Architect's View of MongoDB
An Enterprise Architect's View of MongoDB
 
Building an Authorization Solution for Microservices Using Neo4j and OPA
Building an Authorization Solution for Microservices Using Neo4j and OPABuilding an Authorization Solution for Microservices Using Neo4j and OPA
Building an Authorization Solution for Microservices Using Neo4j and OPA
 
Profiles and permission sets
Profiles and permission setsProfiles and permission sets
Profiles and permission sets
 
The Hyperledger Indy Public Blockchain Node
The Hyperledger Indy Public Blockchain NodeThe Hyperledger Indy Public Blockchain Node
The Hyperledger Indy Public Blockchain Node
 
SHACL in Apache jena - ApacheCon2020
SHACL in Apache jena - ApacheCon2020SHACL in Apache jena - ApacheCon2020
SHACL in Apache jena - ApacheCon2020
 
How to create a User Defined Policy with IBM APIc (v10)
How to create a User Defined Policy with IBM APIc (v10)How to create a User Defined Policy with IBM APIc (v10)
How to create a User Defined Policy with IBM APIc (v10)
 
OpenID Connect Explained
OpenID Connect ExplainedOpenID Connect Explained
OpenID Connect Explained
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Intro to Product Management and Business Model Canvas (BMC)
Intro to Product Management and Business Model Canvas (BMC)Intro to Product Management and Business Model Canvas (BMC)
Intro to Product Management and Business Model Canvas (BMC)
 
Mulesoft meetup slides mumbai_20113019_exception_handling
Mulesoft meetup slides mumbai_20113019_exception_handlingMulesoft meetup slides mumbai_20113019_exception_handling
Mulesoft meetup slides mumbai_20113019_exception_handling
 
Caching Strategies
Caching StrategiesCaching Strategies
Caching Strategies
 
Triplestore and SPARQL
Triplestore and SPARQLTriplestore and SPARQL
Triplestore and SPARQL
 
Manejo de indicadores clave de desempeño (KPI) con Power BI
Manejo de indicadores clave de desempeño (KPI) con Power BIManejo de indicadores clave de desempeño (KPI) con Power BI
Manejo de indicadores clave de desempeño (KPI) con Power BI
 

Similar to Filtering, Searching, and Sorting ActiveRecord Lists Using Filterrific

Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)Kai Chan
 
Apache Solr crash course
Apache Solr crash courseApache Solr crash course
Apache Solr crash courseTommaso Teofili
 
Calypso underhood
 Calypso underhood Calypso underhood
Calypso underhoodESUG
 
Advanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojoAdvanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojoFu Cheng
 
NEMROD : Symfony2 components to work with native RDF
NEMROD : Symfony2 components to work with native RDFNEMROD : Symfony2 components to work with native RDF
NEMROD : Symfony2 components to work with native RDFConjecto
 
The openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageThe openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageNeo4j
 
AAT LOD Microthesauri
AAT LOD MicrothesauriAAT LOD Microthesauri
AAT LOD MicrothesauriMarcia Zeng
 
springdatajpa-up.pdf
springdatajpa-up.pdfspringdatajpa-up.pdf
springdatajpa-up.pdfssuser0562f1
 
DSpace 4.2 Transmission: Import/Export
DSpace 4.2 Transmission: Import/ExportDSpace 4.2 Transmission: Import/Export
DSpace 4.2 Transmission: Import/ExportDuraSpace
 
Apache Solr Workshop
Apache Solr WorkshopApache Solr Workshop
Apache Solr WorkshopJSGB
 
ASP.NET MVC_Routing_Authentication_Aurhorization.pdf
ASP.NET MVC_Routing_Authentication_Aurhorization.pdfASP.NET MVC_Routing_Authentication_Aurhorization.pdf
ASP.NET MVC_Routing_Authentication_Aurhorization.pdfsetit72024
 
Using the latest Java Persistence API 2.0 features
Using the latest Java Persistence API 2.0 featuresUsing the latest Java Persistence API 2.0 features
Using the latest Java Persistence API 2.0 featuresArun Gupta
 
Understanding
Understanding Understanding
Understanding Arun Gupta
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to ElasticsearchSperasoft
 
Multi faceted responsive search, autocomplete, feeds engine & logging
Multi faceted responsive search, autocomplete, feeds engine & loggingMulti faceted responsive search, autocomplete, feeds engine & logging
Multi faceted responsive search, autocomplete, feeds engine & logginglucenerevolution
 
Resource Routing in ExpressionEngine
Resource Routing in ExpressionEngineResource Routing in ExpressionEngine
Resource Routing in ExpressionEngineMichaelRog
 
OpenCms Days 2012 - OpenCms 8.5: Using Apache Solr to retrieve content
OpenCms Days 2012 - OpenCms 8.5: Using Apache Solr to retrieve contentOpenCms Days 2012 - OpenCms 8.5: Using Apache Solr to retrieve content
OpenCms Days 2012 - OpenCms 8.5: Using Apache Solr to retrieve contentAlkacon Software GmbH & Co. KG
 

Similar to Filtering, Searching, and Sorting ActiveRecord Lists Using Filterrific (20)

Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
 
Apache Solr crash course
Apache Solr crash courseApache Solr crash course
Apache Solr crash course
 
Calypso underhood
 Calypso underhood Calypso underhood
Calypso underhood
 
S313431 JPA 2.0 Overview
S313431 JPA 2.0 OverviewS313431 JPA 2.0 Overview
S313431 JPA 2.0 Overview
 
Advanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojoAdvanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojo
 
NEMROD : Symfony2 components to work with native RDF
NEMROD : Symfony2 components to work with native RDFNEMROD : Symfony2 components to work with native RDF
NEMROD : Symfony2 components to work with native RDF
 
The openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query LanguageThe openCypher Project - An Open Graph Query Language
The openCypher Project - An Open Graph Query Language
 
Elastic tire demo
Elastic tire demoElastic tire demo
Elastic tire demo
 
AAT LOD Microthesauri
AAT LOD MicrothesauriAAT LOD Microthesauri
AAT LOD Microthesauri
 
springdatajpa-up.pdf
springdatajpa-up.pdfspringdatajpa-up.pdf
springdatajpa-up.pdf
 
DSpace 4.2 Transmission: Import/Export
DSpace 4.2 Transmission: Import/ExportDSpace 4.2 Transmission: Import/Export
DSpace 4.2 Transmission: Import/Export
 
Logstash
LogstashLogstash
Logstash
 
Apache Solr Workshop
Apache Solr WorkshopApache Solr Workshop
Apache Solr Workshop
 
ASP.NET MVC_Routing_Authentication_Aurhorization.pdf
ASP.NET MVC_Routing_Authentication_Aurhorization.pdfASP.NET MVC_Routing_Authentication_Aurhorization.pdf
ASP.NET MVC_Routing_Authentication_Aurhorization.pdf
 
Using the latest Java Persistence API 2.0 features
Using the latest Java Persistence API 2.0 featuresUsing the latest Java Persistence API 2.0 features
Using the latest Java Persistence API 2.0 features
 
Understanding
Understanding Understanding
Understanding
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to Elasticsearch
 
Multi faceted responsive search, autocomplete, feeds engine & logging
Multi faceted responsive search, autocomplete, feeds engine & loggingMulti faceted responsive search, autocomplete, feeds engine & logging
Multi faceted responsive search, autocomplete, feeds engine & logging
 
Resource Routing in ExpressionEngine
Resource Routing in ExpressionEngineResource Routing in ExpressionEngine
Resource Routing in ExpressionEngine
 
OpenCms Days 2012 - OpenCms 8.5: Using Apache Solr to retrieve content
OpenCms Days 2012 - OpenCms 8.5: Using Apache Solr to retrieve contentOpenCms Days 2012 - OpenCms 8.5: Using Apache Solr to retrieve content
OpenCms Days 2012 - OpenCms 8.5: Using Apache Solr to retrieve content
 

Recently uploaded

The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park masabamasaba
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsBert Jan Schrijver
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfonteinmasabamasaba
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesVictorSzoltysek
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...masabamasaba
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfproinshot.com
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...Nitya salvi
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburgmasabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...masabamasaba
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 

Recently uploaded (20)

The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 

Filtering, Searching, and Sorting ActiveRecord Lists Using Filterrific