where.not

アクティブレコードのwhere.notを使った実装を考えていたのですが、

where.notが変換されるSQL(WHERE ~ NOT IN)にはINの引数にNILLである値が含まれていると何も取得できないという注意点があるようなので、where.notでもそうなの?!と思い試してみました。

 

以下が試してみた内容です。

> Pet.where.not(id: [1,nil])

Pet Load (45.5ms)  SELECT  `pets`.* FROM `pets` WHERE NOT *1 LIMIT 11

=> #<ActiveRecord::Relation [#<Pet id: 2, name: "Puffball", owner: "Diane", species: "hamster", sex: "f", birth: "1989-08-31", death: "1995-07-29", created_at: "2019-11-04 09:28:57", updated_at: "2019-11-04 09:28:57">, #<Pet id: 3, name: "Bowser", owner: "Diane", species: "dog", sex: "m", birth: "1989-08-30", death: "1995-07-29", created_at: "2019-11-04 09:30:18", updated_at: "2019-11-04 09:30:18">, #<Pet id: 4, name: "Momiji", owner: "Hayashi", species: "dog", sex: "m", birth: "2003-08-12", death: nil, created_at: "2019-11-04 09:31:18", updated_at: "2019-11-04 09:31:18">, #<Pet id: 5, name: "Buffy", owner: "Nana", species: "dog", sex: "f", birth: "1991-10-10", death: nil, created_at: "2019-11-04 09:32:08", updated_at: "2019-11-04 09:32:08">, #<Pet id: 6, name: "chee", owner: "yoshino", species: "fish", sex: "f", birth: "1994-08-01", death: nil, created_at: "2019-11-09 13:57:26", updated_at: "2019-11-09 13:57:26">]>

 どうやらアクティブレコード側で対処してくれているようで、ちゃんとこちらの希望通りに取得できておりました。

 

 

感想その他

アクティブレコードのwhere.notについても、

SQLのWHERE ~ NOT INについてもまだよくわからない部分があるので引き続き調べてみようと思います!

 

 

 

 

*1:`pets`.`id` = 1 OR `pets`.`id` IS NULL

外部キー制約

外部キー制について考える機会があったのでメモしておきます〜

 

外部キー制約とは

外部キーは関連づけているテーブル間のデータの整合性を保つために存在する制約です。

外部キー制約を設定しておくと、存在しないidで外部キーを保存する事ができなくなります。

 

 

 

railsで外部キーを設定する

テーブル作成する時のマイグレーションファイルで外部キーとして設定したいカラムを以下のように設定します。

t.refernce  親モデル名, foreign_key: true

 

こうするとカラムは 親モデル名_id という名前で、外部キー制約が設定された状態で作成されます。

インデックスも貼ってくれます。

 

 

感想その他

モデルでバリデーションかけるとしても、データベースは必ず整合性の取れた状態であってほしいので、データベースレベルでの制約も必要ですね!!

自分が間違えてSQL実行してしまった場合にはモデルのバリデーションはあてになりませんし。。。

 

 

横スワイプで画面が戻らないようにする

ブラウザで横スワイプで画面が戻ってしまうのが不便だと感じておりました。

ただ横にスクロールして見えてない部分を確認しているだけなのに、横にスワイプとみなされて戻ってしまう事が結構ストレスでした。

(特にGitHubのコメント欄でコードが横長になっており確認するために横スクロールする事が多かった)

そこで横スワイプで画面が戻らないよう設定したらとても快適でした!!

 

 

方法

システム環境設定 →トラックパッド → その他のジェスチャ → ページ間をスワイプのチェックを外す、という作業だけでした!!

 

 

感想その他

作業環境を快適に整えるのは大事ですね!!

大事な仕様を考えている時にストレスが発生するととても良くないので、これからも作業が快適になる系の改善をしていきたいです!!

 

pcではなくスマホツイッターアプリでも似たようなストレス(横スワイプする気ないのにされて画面が戻ってしまう)に見舞われる事があるのでこちらも設定したいですw

&、-、select、reject

今日使ったArrayクラスのメソッドについてメモしておきます。

何回も使ったことあるのにいつも記憶が曖昧で調べている気がしますw

 

&

複数の配列を比較して重複してる値を返してくれます。

 

[1,2,3,4,5,] & [2,3,4,7]

=> [2,3,4]

 

-

2つの配列を比較し、前者の配列のうち後者に含まれている値を除いてくれます。

 

[1,2,3,4,5,] - [2,3,4,7]

=> [1,5]

 

 

select

 全ての要素にブロックを実行し、 trueとなった要素のみの新しい配列を返してくれます。
(select! だと新しい配列を返すのではなく、レシーバー自体を変更します。)

 

 

array = [1,2,3]

new_array = array.select { |i| i == 2 }

p array => [1,2,3]

p new_array => [2]

 

 

 reject

全ての要素にブロックを実行し、 trueとなった要素を取り除いて新しい配列を返してくれます。

(reject! だと新しい配列を返すのではなく、レシーバー自体を変更します。)

 

array = [1,2,3]

new_array = array.reject { |i| i == 2 }

p array => [1,2,3]

p new_array => [1,3]

 

 

 

感想その他

いい加減ぱっと使いこなせるようにならなくては。。。

 

 

文字集合と符号化方式

文字コードの構成要素には、文字集合、符号化方式の2つがある事を昨日知りました。なので今日は文字集合、符号化方式について調べました。

 

文字集合とは

表現できる文字の集合です。

 

符号化方式とは

文字をコンピュータ上でどういった数値で表現するかを定義したものです。

 

 

Unicode文字集合


UTF-8, UTF-16Unicodeの符号化方式
UTF-8は8bit単位、UTF-16は16bit単位で表現されます。

 

感想その他

前職でエクセルで文字化けしないCSVを出力する機能を作った際に文字コードについて少し調べましたが、文字集合、符号化方式の2つの違いをよくわかっておりませんでした。

知れて良かったです!

 

 

 

文字コード

 今日は文字コードについて少し調べました〜

 

文字コードとは

文字に数値を当てはめたものです。

 

 文字コードの種類
  • ASCII

アルファベット、数字、その他記号を表現できる。7ビットで1文字を表現できる。

 

1文字2バイトで表現されます。

ASCIIで表現できるものに加え、ひらがな、カタカナ、漢字が使えます。

 

世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えで作られた文字コードです。

はじめは1文字2バイトでしたが足りなくなり、3バイト、4バイトと拡張されています。

 

何でいろんな種類があるか

以下のような歴史的な経緯があるためだそうです。

アルファベットを1バイト以下で表現するASCII誕生

→ アルファベット意外にも対応するため2バイトの文字コードが誕生

→ 互換性を保つために複雑化

 

 

感想その他

UnicodeUTF-8とがごっちゃになっているのでその辺りも整理したいです。

 

 

アクティブレコードでのトランザクション

昨日はSQLでのトランザクションについて書いたので、

今日はアクティブレコードでのトランザクションについて調べてみました!

 

 

書き方

 以下のように書くことができます。

① モデル.transaction do
② DBに変更を加える(updateやdeleteなど)

③ end

④ 上手くいった場合の処理

⑤  rescue => e

⑥  失敗した場合の処理

例外が時発生した場合にROLLBACKが発生するので、

モデル.transaction do ~ endの中の処理は例外を発生させるように書かないといけないようです。

(saveじゃなくてsave!とかく)

 

 

感想その他

アクティブレコードでのトランザクションは例外処理とセットになっているため、

モデル.transaction do ~ endの中の処理で例外を発生させるように書くことを気をつけなくてはと思いました。