## Rails 6.1 Sharding Demo
Install Rails
> gem install rails
Create a new rails app
> rails new todo --database=postgresql
Bundle and voilá!
Let's make a bunch of databases. Update your database.yml like so (much of what comes being taken from the commit's docs):
```ruby
development:
primary:
<<: *default
database: my_primary_database
primary_replica:
database: my_primary_database
replica: true
primary_shard_one:
<<: *default
database: my_primary_shard_one
primary_shard_one_replica:
<<: *default
database: my_primary_shard_one
replica: true
```
You can use whatever database or adapter you want. I normally hook up Postgres, today playing around with SQLite3.
In this setup from the docs, we have a primary and primary_shard, and each has a replica. Nifty!
Then run:
```ruby
rails db:create; rails db:migrate
# Created database 'my_primary_database'
# Created database 'my_primary_shard_one'
# Time to fill the database
# Let's generate a model:
rails g model Post title:string
rails db:migrate
```
```
#=>
== 20210311143955 CreatePosts: migrating ======================================
-- create_table(:posts)
-> 0.0127s
== 20210311143955 CreatePosts: migrated (0.0128s) =============================
== 20210311143955 CreatePosts: migrating ======================================
-- create_table(:posts)
-> 0.0060s
== 20210311143955 CreatePosts: migrated (0.0060s) =============================
```
And either in a seeds file or our console, run:
```ruby
Post.create!(title: 'Foo')
Post.create!(title: 'Bar')
Post.create!(title: 'Fizz')
```
Playing with the databases:
Now, let's update our application_record.rb like so:
```ruby
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
connects_to shards: {
default: { writing: :primary, reading: :primary_replica },
shard_one: { writing: :primary_shard_one, reading: :primary_shard_one_replica }
}
end
```
We will now reload our console and see what we can do, using: `ActiveRecord::Base.connected_to`
```ruby
ActiveRecord::Base.connected_to(role: :reading, shard: :shard_one) do
Post.first
end
```
> #=> nil
### Now let's write to :shard_one
```ruby
ActiveRecord::Base.connected_to(role: :writing, shard: :shard_one) do
Post.create!(
title: 'Buzz'
)
Post.create!(
title: 'Woof'
)
end
```
> It works!
### And we'll read from :shard_one's replica:
```ruby
ActiveRecord::Base.connected_to(role: :reading, shard: :shard_one) do
Post.count
end
```
> #=> 2
### And finally confirm that shard one's data has not been written to primary:
```ruby
ActiveRecord::Base.connected_to(role: :reading, shard: :default) do
Post.count
end
```
> #=> 3
This is correct, remember the three posts we created earlier who default to the primary database.
That's it!