プロローグ
Rails今までやってきて、あまり基礎力というか、地力ついた感じしないんすけど、何やったらいいすかねーーー。。。ってruby-jpに相談したら、
https://github.com/ttanimichi/0ch#sinatra%E3%81%A7%E6%8E%B2%E7%A4%BA%E6%9D%BF%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86
この課題に取り組んでみてください。
とアドバイスをいって頂いた。
この課題を見てみると、ActiveRecordを使わずに、生SQLを書いて掲示板アプリを作るという指定があった。
そんなことやったことがないので、早速詰んだ。
def save
validate
DB.query("INSERT INTO posts (name, email, body, topic_id, created_at) VALUES ('#{@name}', '#{@email}', '#{@body}', '#{@topic_id}', NOW())")
end
多分だけど、この生SQLを書けば、ActiveRecord使わずとも、データベースとやり取りができそう。
ActiveRecordのsaveメソッドがそこら辺をよしなにやってくれてたと思うと、そりゃ実力付かんわ。
と改めて反省。
何はともあれ、ActiveRecordを使わずにデータベースを操作する練習をしなきゃならんので、
https://qiita.com/toshiro3/items/b65b2ad744d8f3ecc734
この記事をやってみることに。
この記事通りだとうまく行かないことあるので、
補足させていただくと
まず、CREATE DATABASE test;
を実行しないと、
create table test.languages (id int, name varchar(32));
これでエラー出るようです。
CHAR 型は指定した文字数以下の文字を格納した場合には文字列の末尾に空白を必要なだけ付け加えて指定の長さの文字列として格納します。ただし値を取得する場合は末尾にある空白は全て削除された上で取得されます。比較される時も同じです。
VARCHAR 型は末尾に空白を付けるようなことはしません。また現行のバージョンでは末尾に空白がある文字列であっても空白が付いたまま格納されます。取得する時も空白付きで取得しますが、 WHERE 句で比較する時だけ末尾の空白を削除した上で比較されます。
引数には、最大文字列を指定してるっぽい。
https://www.dbonline.jp/mysql/type/index3.html
引用
require 'mysql2'
client = Mysql2::Client.new(:host => 'localhost', :user => 'root', :password => 'password')
query = %q{select user, host from test.languages}
results = client.query(query)
results.each do |row|
puts "--------------------"
row.each do |key, value|
puts "#{key} => #{value}"
end
end
これだとエラー出るので、
require 'mysql2'
query = %q{select * from test.languages}
に変更。
てか、require 'mysql2'
って書いた時点で、mysql使えるのはしゅごい。
Macにmysqlをインストールしたからなのは分かってるけど。。。。
そこら辺を上手いこと参照してくれるのは驚き。
将来の成長した自分が、そこら辺の疑問点を解決してくれることを願って、先に進めよう。
あと
%q{}って記法がよく分からないので、調べてみると
https://qiita.com/mogulla3/items/46bb876391be07921743
シングルクオートやダブルクオートのエスケープが不要になる。
うん、意味が分からん。
https://blog.senseshare.jp/escape.html
を参考にして説明すると、
エスケープ処理とは、プログラムの中で使う特殊な記号を「ただの文字」として扱いたい時に行う処理です。
とありました。なるほど、なるほど。
次回はいよいよ
https://github.com/ttanimichi/0ch#sinatra%E3%81%A7%E6%8E%B2%E7%A4%BA%E6%9D%BF%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86
この課題のコードリーディングで基礎力や地力をつけていきたいと思います。