アプリケーションでデータを持続させる
データベースバックアップアプリケーション
URLを介してデータを渡すことは、Webアプリケーションに動的コンテンツを応答させるための1つの方法ですが、動的Webの最も一般的なパラダイムは「データベースバックアップアプリケーション」です。サーバーはクライアントにレスポンスを返すため、バックエンドデータベースにクエリを行います。
このユースケースでは、レスポンスの動的性質はリクエスト内のデータからではなく、バックエンドデータベースの「状態」から得られます。
これは大きな話題で、いくつかのセクションを使って説明します。 私たちは、このパラダイムとのやりとりを歩くために、実際のWebアプリケーション、ブログを作成します。
データベースの準備
まずは、作業するブログ記事のデータベースを用意しましょう。 Railsに組み込まれている軽量データベースであるSQLite3を使用します。
データベースの記事を扱う際には、以下について考える必要があります:
1データベースの構造(テーブルとその列)
2データそのもの(個々の投稿を表す行)
構造については、投稿テーブルに各投稿の詳細を保持する必要があります。 各投稿には次の属性があります:
id(integer)title(string)body(text)author(string)created_at(datetime)
これらはそれぞれ、データベース内のpostsテーブルの列になります。
このテーブルを作成するには、次のSQLファイルを使用します。
db/posts.sql
CREATE TABLE "posts" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "body" text, "author" varchar, "created_at" datetime NOT NULL);
postsテーブルに、次のCSV(Comma-Separated Value)ファイルを使用してダミーポストをいくつか挿入します。
db/posts.csv
1,Blog 1,Lorem ipsum dolor sit amet.,Brad,2014-12-07 2,Blog 2,Lorem ipsum dolor sit amet.,Chris,2014-12-08 3,Blog 3,Lorem ipsum dolor sit amet.,Kevin,2014-12-09
したがって、データベースを作成し、それに対してSQLを実行し、内部に投稿テーブルを作成するには、「Railsルートディレクトリ」、つまりapp とdbのようなディレクトリを含むRailsアプリケーションの最上位ディレクトリ で以下の命令を実行します:
sqlite3 db/development.sqlite3 < db/posts.sql
このプロジェクトでは、DBMS(データベース管理システム)としてSQLite3を使用します。 そこには他にはるかに強力なDBMSがありますが、SQLite3はRailsのデフォルトの開発データベースであり、うまく機能するため、これを使用します。
このコマンドの結果、db / development.sqlite3ファイルが作成されます。このファイルには、SQLite3データベースが含まれています。 そして、私たちはそれに対してposts.sqlファイルを実行したので、postsテーブルを持ちます。
SQLite3コンソールを実行して見てみましょう:
$ sqlite3 db/development.sqlite3
sqlite> .tables posts
sqlite> SELECT * FROM posts; sqlite>
私たちの投稿テーブルはありますが、そのSELECTからの空白の返信からわかるように、まだテーブルに投稿行はありません。
CSVファイルをインポートすることで、この問題を解決できます。 まずSQLite3にCSVファイルをインポートしていることを伝える必要があります。次に、このようにインポートを実行できます:
sqlite> .mode csv sqlite> .import db/posts.csv posts
さて、私たちが持っているものを見てみましょう:
sqlite> SELECT * FROM posts; 1,"Blog 1","Lorem ipsum dolor sit amet.",Brad,2014-12-07 2,"Blog 2","Lorem ipsum dolor sit amet.",Chris,2014-12-08 3,"Blog 3","Lorem ipsum dolor sit amet.",Kevin,2014-12-09
sqlite> SELECT title FROM posts; "Blog 1" "Blog 2" "Blog 3"
sqlite> SELECT created_at FROM posts WHERE id=1; 2014-12-07
.quitコマンドを使用してsqlite REPLを終了することができます。これでいくつかの記事データを持っているので、色々な試しに行きましょう。
データベースと対話する
このデータベースをRailsで扱う方法について説明する前に、純粋なRubyを使ってこのデータベースとやりとりする方法を見てみましょう。
RubyのSQLite3データベースに接続する方法が必要です。幸いなことは、Rubyライブラリsqlite3があります。
$ irb
> require 'sqlite3' => true
# setup db connection > connection = SQLite3::Database.new 'db/development.sqlite3' => #<SQLite3::Database:0x000000039ff288 ... >
ここでは、ライブラリを利用できるようにするためにライブラリを用意する必要があります。次に、dbite.sqlite3データベースに問い合わせるためのSQLite3 :: Databaseオブジェクトをインスタンス化します。
これで、Rubyを使用してデータベースに対してSQLを実行するようになりました。
> post_arrays = connection.execute 'SELECT * FROM posts'
=> [
[1, "Blog 1", "Lorem ipsum dolor sit amet.", "Brad", "2014-12-07"],
[2, "Blog 2", "Lorem ipsum dolor sit amet.", "Chris", "2014-12-08"],
[3, "Blog 3", "Lorem ipsum dolor sit amet.", "Kevin", "2014-12-09"]
]
connection.executeにSQL文字列を渡してデータベースに対して実行させます。 このconnection.executeコールからの戻り値は配列の配列であり、それぞれがテーブル行を表します。
ポストローを表す配列は、次の形式で値を保持します。
[id, title, body, author, created_at]
テーブルの列を宣言した順序なので意味がありますが、特に便利ではありません。
たとえば、投稿のタイトルが必要な場合、タイトルはこれらの配列のインデックス1にあることを知っておく必要があります。その後、post [1]を使用してタイトル文字列を取得します。代わりに、これらの投稿をハッシュとしてGoogleに返すことはうれしいので、投稿のタイトルが必要な場合は、post [‘title’]を使用して取得することができます。
便利なことに、これらの行をハッシュとして返すように接続を宣言することができます。
> connection.results_as_hash = true => true
> connection.execute('SELECT * FROM posts').first
=> {
"id" => 1,
"title" => "Blog 1",
"body" => "Lorem ipsum dolor sit amet.",
"author" => "Brad",
"created_at" => "2014-12-07",
0 => 1,
1 => "Blog 1",
2 => "Lorem ipsum dolor sit amet.",
3 => "Brad",
4 => "2014-12-07"
}
今度はSELECTから返された配列の最初の要素を見ると、post [title]というポストタイトルを得ることができるハッシュが戻ってくることがわかります。
ちなみに、タイトルは整数キー1でハッシュにも格納されているので、post [1]でタイトルを見つけることはできます。
これらのキーは、配列がもはや配列でなくても、ハッシュが前の配列とまったく同じように動作することを可能にします(少なくとも[]を使った値アクセスに関して)。
賢いですね!
データベースにいくつかの投稿があり、Rubyでそれらを手に入れることができるようになった今、私たちのWebアプリケーションを構築し始めましょう。