Slide 1

Slide 1 text

Introduction to Arel

Slide 2

Slide 2 text

Bruno Sutic
 Rails & Javascript developer
 
 Ideal Project Group, Chicago github.com/bruno-
 @brunosutic

Slide 3

Slide 3 text

What is Arel? • github.com/rails/arel • “Simplifies generation of complex SQL”
 You write Ruby, out comes the SQL • dependency of ActiveRecord • can be used together with ActiveRecord

Slide 4

Slide 4 text

How I learned about Arel? • credit: Janko Marohnic • used Arel to optimize a feature on a project

Slide 5

Slide 5 text

Demo to get you interested :)

Slide 6

Slide 6 text

Prerequisites for the examples • ‘Customer’ is an ActiveRecord model • Arel api for a column:
 Customer.arel_table[:name] • A “convention”:
 class Customer
 def self.[](column)
 arel_table[column]
 end
 end Customer[:name]

Slide 7

Slide 7 text

Basic example • ActiveRecord
 Customer.where(name: variable) • Arel
 Customer.where(Customer[:name].eq(variable))

Slide 8

Slide 8 text

A bit more useful example • ActiveRecord
 Customer.joins(:sales)
 .where(“sales.price” => variable)
 
 or
 
 Customer.joins(:sales)
 .where(sales: { price: variable }) • Arel
 Customer.joins(:sales)
 .where(Sale[:price].eq(variable))

Slide 9

Slide 9 text

SQL comparisons example • ActiveRecord
 Customer.where(“credits > ?”, credits_variable) • Arel
 Customer.where(
 Customer[:credits].gt(credits_variable)
 ) • All comparison operators:
 gt, lt, gteq, lteq

Slide 10

Slide 10 text

OR condition example • ActiveRecord
 Customer.where(“credits > ? OR credits < ?”, var1, var2) • Arel
 Customer.where(
 Customer[:credits].gt(var1).or(
 Customer[:credits].lt(var2)
 )
 )

Slide 11

Slide 11 text

Complex conditions example • ActiveRecord
 Customer.where(
 “credits > ? OR (name = ? AND credits < ?)”, var1, var2, var3
 ) • Arel
 Customer.where(
 Customer[:credits].gt(var1).or(
 Customer[:name].eq(var2).and(
 Customer[:credits].lt(var3)
 )
 )
 )

Slide 12

Slide 12 text

LIKE example • ActiveRecord
 Customer.where(“name LIKE ?”, “%#{variable}%”) • Arel
 Customer.where(Customer[:name].matches(“%#{variable}%”))

Slide 13

Slide 13 text

Other features • support for all SQL ‘join’ types • SQL literals • writing only a part of a bigger query as SQL • example: CASE statement

Slide 14

Slide 14 text

Benefits of using Arel • pure Ruby, nicer looking code • proper code highlighting • ruby exceptions • completely avoids SQL injection

Slide 15

Slide 15 text

Arel resources • github repo:
 https://github.com/rails/arel • great speech:
 https://www.youtube.com/watch?v=ShPAxNcLm3o • source code walkthrough:
 https://www.youtube.com/watch?v=EJ6b_2S9Ids • examples from this talk:
 https://gist.github.com/bruno-/5964403476c791331c49

Slide 16

Slide 16 text

Questions?