SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
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)

Weitere ähnliche Inhalte

Was ist angesagt?

JSON-LD: JSON for the Social Web
JSON-LD: JSON for the Social WebJSON-LD: JSON for the Social Web
JSON-LD: JSON for the Social WebGregg Kellogg
 
Request dispacther interface ppt
Request dispacther interface pptRequest dispacther interface ppt
Request dispacther interface pptTaha Malampatti
 
Solr Application Development Tutorial
Solr Application Development TutorialSolr Application Development Tutorial
Solr Application Development TutorialErik Hatcher
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web APIhabib_786
 
Asp.net MVC training session
Asp.net MVC training sessionAsp.net MVC training session
Asp.net MVC training sessionHrichi Mohamed
 
Alfresco devcon 2019: How to track user activities without using the audit fu...
Alfresco devcon 2019: How to track user activities without using the audit fu...Alfresco devcon 2019: How to track user activities without using the audit fu...
Alfresco devcon 2019: How to track user activities without using the audit fu...konok
 
Understanding LINQ in C#
Understanding LINQ in C# Understanding LINQ in C#
Understanding LINQ in C# MD. Shohag Mia
 
Jose portillo dev con presentation 1138
Jose portillo   dev con presentation 1138Jose portillo   dev con presentation 1138
Jose portillo dev con presentation 1138Jose Portillo
 
What's new in Scala 2.13?
What's new in Scala 2.13?What's new in Scala 2.13?
What's new in Scala 2.13?Hermann Hueck
 
MongoDB Aggregation Framework
MongoDB Aggregation FrameworkMongoDB Aggregation Framework
MongoDB Aggregation FrameworkCaserta
 
Speed Up Your APEX Apps with JSON and Handlebars
Speed Up Your APEX Apps with JSON and HandlebarsSpeed Up Your APEX Apps with JSON and Handlebars
Speed Up Your APEX Apps with JSON and HandlebarsMarko Gorički
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJSDavid Parsons
 
[APJ] Common Table Expressions (CTEs) in SQL
[APJ] Common Table Expressions (CTEs) in SQL[APJ] Common Table Expressions (CTEs) in SQL
[APJ] Common Table Expressions (CTEs) in SQLEDB
 
The evolution of Apache Calcite and its Community
The evolution of Apache Calcite and its CommunityThe evolution of Apache Calcite and its Community
The evolution of Apache Calcite and its CommunityJulian Hyde
 
Introduction to Apache Calcite
Introduction to Apache CalciteIntroduction to Apache Calcite
Introduction to Apache CalciteJordan Halterman
 
PostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | EdurekaPostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | EdurekaEdureka!
 

Was ist angesagt? (20)

JSON-LD: JSON for the Social Web
JSON-LD: JSON for the Social WebJSON-LD: JSON for the Social Web
JSON-LD: JSON for the Social Web
 
ShEx vs SHACL
ShEx vs SHACLShEx vs SHACL
ShEx vs SHACL
 
Request dispacther interface ppt
Request dispacther interface pptRequest dispacther interface ppt
Request dispacther interface ppt
 
Solr Application Development Tutorial
Solr Application Development TutorialSolr Application Development Tutorial
Solr Application Development Tutorial
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
Asp.net MVC training session
Asp.net MVC training sessionAsp.net MVC training session
Asp.net MVC training session
 
Alfresco devcon 2019: How to track user activities without using the audit fu...
Alfresco devcon 2019: How to track user activities without using the audit fu...Alfresco devcon 2019: How to track user activities without using the audit fu...
Alfresco devcon 2019: How to track user activities without using the audit fu...
 
How to Design Indexes, Really
How to Design Indexes, ReallyHow to Design Indexes, Really
How to Design Indexes, Really
 
Understanding LINQ in C#
Understanding LINQ in C# Understanding LINQ in C#
Understanding LINQ in C#
 
Postgresql
PostgresqlPostgresql
Postgresql
 
Jose portillo dev con presentation 1138
Jose portillo   dev con presentation 1138Jose portillo   dev con presentation 1138
Jose portillo dev con presentation 1138
 
What's new in Scala 2.13?
What's new in Scala 2.13?What's new in Scala 2.13?
What's new in Scala 2.13?
 
MongoDB Aggregation Framework
MongoDB Aggregation FrameworkMongoDB Aggregation Framework
MongoDB Aggregation Framework
 
Speed Up Your APEX Apps with JSON and Handlebars
Speed Up Your APEX Apps with JSON and HandlebarsSpeed Up Your APEX Apps with JSON and Handlebars
Speed Up Your APEX Apps with JSON and Handlebars
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
[APJ] Common Table Expressions (CTEs) in SQL
[APJ] Common Table Expressions (CTEs) in SQL[APJ] Common Table Expressions (CTEs) in SQL
[APJ] Common Table Expressions (CTEs) in SQL
 
The evolution of Apache Calcite and its Community
The evolution of Apache Calcite and its CommunityThe evolution of Apache Calcite and its Community
The evolution of Apache Calcite and its Community
 
Introduction to Apache Calcite
Introduction to Apache CalciteIntroduction to Apache Calcite
Introduction to Apache Calcite
 
PostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | EdurekaPostgreSQL Tutorial For Beginners | Edureka
PostgreSQL Tutorial For Beginners | Edureka
 
Introduction to java 8 stream api
Introduction to java 8 stream apiIntroduction to java 8 stream api
Introduction to java 8 stream api
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Hararemasabamasaba
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...Jittipong Loespradit
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...chiefasafspells
 
%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
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
 
%+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
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
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
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationJuha-Pekka Tolvanen
 
tonesoftg
tonesoftgtonesoftg
tonesoftglanshi9
 
%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
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfkalichargn70th171
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburgmasabamasaba
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 

Kürzlich hochgeladen (20)

Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
%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
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
%+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...
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
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
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
%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
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 

Filtering, Searching, and Sorting ActiveRecord Lists Using Filterrific