Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Elixir and Ecto
Search
Patrick Van Stee
October 03, 2013
Technology
990
5
Share
Elixir and Ecto
Patrick Van Stee
October 03, 2013
More Decks by Patrick Van Stee
See All by Patrick Van Stee
Raft: Consensus for Rubyists
vanstee
141
7.4k
Bootstrap
vanstee
8
830
HTTP API Design for iOS Applications
vanstee
11
690
Consensus: An Introduction to Raft
vanstee
21
3.1k
Convergent Replicated Data Types
vanstee
4
850
Pour Over Brewing Method
vanstee
1
400
Celluloid & DCell
vanstee
4
600
Map Reduce & Ruby
vanstee
10
880
Other Decks in Technology
See All in Technology
Snowflake Intelligence導入で 分かった活用のコツ
wonohe
0
110
Introduction to Bill One Development Engineer
sansan33
PRO
0
410
ハーネスエンジニアリングの概要と設計思想
sergicalsix
9
3.7k
非エンジニア職からZOZOへ 〜登壇がキャリアに与えた影響〜
penpeen
0
490
AIを共同作業者にして書籍を執筆する方法 / How to Write a Book with AI as a Co-Creator
ama_ch
2
120
Data Hubグループ 紹介資料
sansan33
PRO
0
2.9k
Revisiting [CLS] and Patch Token Interaction in Vision Transformers
yu4u
0
300
🀄️ on swiftc
giginet
PRO
0
390
60分で学ぶ最新Webフロントエンド
mizdra
PRO
33
17k
AI時代のガードレールとしてのAPIガバナンス
nagix
0
180
AWS Agent Registry の基礎・概要を理解する/aws-agent-registry-intro
ren8k
1
270
Do Ruby::Box dream of Modular Monolith?
joker1007
1
280
Featured
See All Featured
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
190
The Curious Case for Waylosing
cassininazir
0
300
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
69
38k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Writing Fast Ruby
sferik
630
63k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Optimizing for Happiness
mojombo
378
71k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
Designing Powerful Visuals for Engaging Learning
tmiket
1
340
The Mindset for Success: Future Career Progression
greggifford
PRO
0
310
Making Projects Easy
brettharned
120
6.6k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
270
Transcript
elixir atlanta meetup
meetup.com/ atlantaelixir @vanstee
None
• speakers • sponsors • twitter • website • github
org • [your great idea]
elixir and ecto
Elixir is a functional, meta-programming aware language built on top
of the Erlang VM.
elixir-lang/elixir @josevalim
defmodule Hello do IO.puts "Before world defined" def world do
IO.puts "Hello World" end IO.puts "After world defined" end Hello.world HELLO.EX
None
Types
# tuple { :a, :b, :c } # list [1,
2, 3] [a: 1, b: 2, c: 3] # record defrecord User, name: "", age: nil User.new(name: "Patrick", age: 25) TYPE.EX
Pattern Matching
# assignment a = 1 # => 1 # matching
1 = a # => 1 2 = a # => ** (MatchError) ... { ^a, b } = { 1, 2 } # b => 2 [head | _] = [1, 2, 3] # head => 1 PATTERN.EX
case { 1, 2, 3 } do { 4, 5,
6 } -> "This won't match" { 1, x, 3 } when x > 0 -> "This will match and assign x" _ -> "No match" end GUARD.EX
Processes
current_pid = self spawn fn -> current_pid <- :hello end
receive do :hello -> IO.puts "Hello World" end PROCESS.EX
defmodule Stacker.Supervisor do use Supervisor.Behaviour def start_link(stack) do :supervisor.start_link(__MODULE__, stack)
end def init(stack) do children = [worker(Stacker.Server, [stack])] supervise children, strategy: :one_for_one end end SUPERVISOR.EX
Protocols Macros DocTest and lots more
elixir-lang.org #elixir-lang
None
None
ecto database query DSL
elixir-lang/ecto @ericmj
defmodule User do use Ecto.Model queryable "user" do field :name,
:string end end MODEL.EX
defmodule FindUser do import Ecto.Query def find_by_name(name) do query =
from u in User, where: u.name == ^name, limit: 1 Repo.all(query) end end QUERY.EX
None
Repo
• wrapper • holds connections • executes queries • supervised
worker
defmodule Repo do use Ecto.Repo, adapter: Ecto.Adapters.Postgres def url do
"ecto://user:pass@localhost/db" end end Repo.all(...) Repo.create(...) Repo.update(...) Repo.delete(...) REPO.EX
Entity
• fields • associations • elixir record
defmodule User do use Ecto.Model queryable "user" do field :name,
:string field :password, :string, default: "secret" has_many :projects, Project end end MODEL.EX
Query
• relational algebra • extendable • macros • keyword lists
def paginate(query, page, size) do extend query, limit: size, offset:
(page - 1) * size end query = FindUser.find_by_state("GA") query |> paginate(1, 50) |> Repo.all PAGINATE.EX
from u in User, where: u.name == ^name, limit: 1
QUERY.EX
from(u in User) |> where([u], u.name == ^name) |> limit(1)
|> select([u], u) QUERY.EX
select( limit( where( from(u in User), [u], u.name == ^name
), 1 ), [u], u ) QUERY.EX
Gotchas
• error messages • validations • callbacks • type conversions
• SQL migrations • missing mix tasks
elixir-lang/ecto examples/simple
Thanks! @josevalim @ericmj #elixir-lang
?