読者です 読者をやめる 読者になる 読者になる

woshidan's blog

そんなことよりコードにダイブ。

RailsのActiveRecordについて

今週つまずいたことや、これ知らなかったんかいってことをメモしておく。

項目

  • whereで範囲の検索をする
  • joinsを使う
  • 表結合について
  • where句で結合先のテーブルの値を使う
  • ActiveRecord::Calculationsを使う

  

whereで範囲の検索をする

Item.where(price: 1000)

のように1000円の商品を検索する、というのはハッシュの形式で検索条件を絞るのだけど、

Item.where('price > ?', 3000)

のように、’’の中に不等号と後ろの引数が代入される?を書けばいい。
××以上、●●以下がやりたい場合は、こう。

Item.where(‘price > ? AND price < ?’, 3000, 5000) 

joinsを使う

joins(:table_name)

で表結合をするのだけど、いくつか注意点。
モデルでassociation(belongs_to: など)を書いていないと動かない、というのと、
associationの時に書いたようにシンボルを書く必要があるので、
あれ、動かないと思ったらモデルのコードを見直すこと。

joinsの結合は内部結合(両方のテーブルに対応するものがあるものしか表示されない)なので、注意すること。

その場で試しに出したいだけだからassociationを書いていないみたいな場合は、joinsの中に直接JOIN節を書く。

表結合について

参考: SQL講座 LEFT JOIN とRIGHT JOIN(表の外部結合)

左結合、右結合について、左側が結合元のテーブルで
左結合、右結合は、どちら側のテーブルの要素を見て、対応させていくか、
手でやる場合を考えると少し分かりやすい気がする。
左結合は左側のテーブルを見て、その項目を指で押さえながら、右側の表であてはまるものを1つ1つ書いていって、
なければNULLを入れて……という感じ。

左側、右側というのは

FROM 顧客表(左側) LEFT JOIN 売上表(右側) ON 顧客表.顧客CD(左側)=売上表.顧客CD(右側)

という感じ。SELECT文中でJOINを真ん中にして左右。


内部結合はどちらか片方がNULLになるような行は表示しないもの。

 

よく考えずにどんどんjoinsしていくといつの間にか要素が0…というのは行き過ぎだけど
テーブルを結合するときはどんなデータが欲しいか、結合はどれを使えばいいか確認してからやる(当たり前だ)。

左結合したときに右側のテーブルの列の値で検索をかける(あるいは右結合したときに左側のテーブルの列の値)と、

当然右側のテーブルの値が該当する行しか残らないから結局内部結合したのと同じ結果になる。

where句で結合先のテーブルの値を使う

結合した先のテーブルの値で検索をかけるには、以下のように、結合したテーブル名.列名にする。

Customer.joins(:purchase_records).where('purchase_records.date'  => Date.today)

ActiveRecord::Calculationsを使う

ActiveRecord::Calculations

鼻血が出るくらい便利。
(実際には親知らずが90度傾いて出て来たから歯医者の椅子の上で死ぬ。まじ歯医者無理)

たとえば、売れている商品の平均金額を取りたい

purchase_record.joins(:items).average(‘items.price')

とか、神か。
個人的にpluckがいちばん便利。でも

ActiveRecord_Relationオブジェクト.pluck(:column_name) = ActiveRecord_Relationオブジェクト.map(&:column_name)

でむしろmapの右側のほうが何をしてるのだっけ、
と調べ直してこっちの意味でも勉強になりました。

mapと同意ということは、pluckの結果は配列で返ってきます。かしこ。