SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

Active Record クエリインターフェイスを読む【Rails Guides】

さてさて、Active Record クエリインターフェイスを読んで行きます。

あ、これ知らなかったなーなんていうことをまとめておきます。

.first(3)

とすると3つとれる。 なんだってー

バッチ

プログラムの一連の流れ あらかじめ決めておいた処理のまとまりのようなもの

scope

category.articles.published の、publishedの部分のこれ。 これができるようにするためのもの

class Article < ApplicationRecord
  scope :published, -> { where(published: true) }
end

と書く!! メソッドのようなものだが、スコープとして定めておくと、クエリが発行されて

class Article < ApplicationRecord
  def self.published
    where(published: true)
  end
end

と書いたことと同義になる。

スコープは自由に定義することが可能、ということですな。

ただし1つ注意点があります。それは条件文を評価した結果がfalseになった場合であっても、スコープは常にActiveRecord::Relationオブジェクトを返すという点です。クラスメソッドの場合はnilを返すので、この振る舞いが異なります。したがって、条件文を使ってクラスメソッドを連鎖させていて、かつ、条件文のいずれかがfalseを返す場合、NoMethodErrorを発生することがあります。

これは注意が必要そう。

15 動的検索

実は動的にメソッドが作られていた。 find_by_method のような形。

18 sqlで検索

find_by_sql

18.2 pluck

モデルから、必要なidだけとりたいとかnameを引っ張りたい時に便利

Client.select(:id).map(&:id)といった記述をしなくてもOK

19 オブジェクトの存在チェック

Client.exists?(id: [1,2,3])という感じ

読書会のススメ

今週から、同期と読書会をしている。

業務後1時間弱、東京タワーの見える椅子に座り、肩を並べて課題図書を読むのである。

今年度中、いや、今年中に読んだ方がいいよ、というか課題図書が出ているのだが
あまり進捗が好ましくなく、今になって焦り始めたのである。

そこでなんとか読み進めようと、読書会をすることとなった。

読書会の方法は、集まって、音読する

言いたいことはわかる。ぶっちゃけ効率悪くね?だ。 まずは継続させることを続けるために集まり、音読をすることにしていた。

やってみてわかったことが以下。

意外と良い

読む間は必然的に文字をしっかりと一句ずつ追うことができるし、疑問点は素直に疑問に思い浮かぶ。 1節ずつくらいの交互に読むようにしておけば、集中力が1時間は簡単に続く。

そしてなによりも進んでいる感覚が強い 声に出して読むので絶対に時間をかければ進むというところもよい。

もしかしたら、難しい本、とにかく進めて行きたい場合には音読読書会は有効なのかもしれない。

みなさんもぜひ

has_oneとbelongs_toの違い

自身が他のテーブルをたどるキーを所持している場合は、belongs_to 自身が他のテーブルからたどるキーで示されている場合は、has_one

belongs_to

class Book < ApplicationRecord
  belongs_to :author
end

と書くとすると Bookテーブルが、author_idをカラムに持っていてAuthorをたどれます。

has_one

class Supplier < ApplicationRecord
  has_one :account
end

Supplierのテーブルにはaccountのidなどはもっていません。 しかし、Accountテーブルはsupplier_idのようにこちらを示すカラムがある場合です。

まとめ

1対1の関係で以上のbelongs_toとhas_oneを書き合う、といったところですね。 親と子供、従属かなどの視点で考えてみるとわかりやすいかもしれません。

参考 Active Record の関連付け (アソシエーション) | Rails ガイド コードはrails guidesからお借りしています。

基礎知識がついた状態

エンジニアとして基礎知識がついた状態ってなんだろう? 何を持って基礎的なものが身についたと言えるんだろう。

自分だと、webアプリエンジニアで、Ruby on Railsを扱ってる。

自分一人でインフラ周りから、アプリの実装までを一人で作り上げて、運用ができる状態?

  • 基礎的な技術書を読破している
  • 質問の内容の質が高い
  • 自分で検索することができる
  • 公式ドキュメントをみてわかる
  • 誰かに教えることができる

まずい、パッと浮かばない。 うーむ?

仕組み作り

仕組みにしてしまえばいい、とは口でいうのは簡単ですが、 実際一年間続くレベルの習慣・仕組みづくりはめっちゃ大変です。

本を以前よりもよく読むようになりましたが、 1、2ヶ月読もう読もうとする気持ちをキープできたことが読むようになったきっかけな気がしてます。

Ruby on Railsガイドを読み進める - validation

Active Record まわり

2.1 acceptance

チェックボックス専用のバリデーション 複数個だとどうなるだろ?

2.2 validates_associated

アソシエーションを張っているものを一緒にバリデーションしてくれる便利くん

validates_associatedは関連付けの両側のオブジェクトでは実行しないでください。 関連付けの両側でこのヘルパーを使用すると無限ループになります。

なんだか物騒なことが書いていた。一方通行で。

2.5 format

マッチするかどうか

2.7 length

length { in: 6..10 }のような範囲指定 is: は一致のバリデーション

2.11 uniqueness

scope: 2つの属性に対して行われる uniqueness: { case_sensitive: false } 大文字小文字の区別をなくす

validates_withとvalidates_each

withだと一つのフィールドにおけるチェックするバリデーションクラスを作成。 validation専用のクラスにレコードを渡す eachではインスタンスに対するレコード、属性、値を渡して個々にチェックすることができます。

と書いてからいろいろ調べてみると validatorの方は複雑なvalidationのとき、 1つのフィールドに対するvalidationをさせたいときはEachvalidatorなんだとか。

まるまる各属性もっていきたい場合はvalidates_with
1つの属性で行う場合は

呼び出し方

class Person
  include ActiveModel::Validations
  validates_with MyValidator
end
class Person < ActiveRecord::Base
  validates :email, presence: true, email: true
end

の違い

3.4 :on

validationを行うタイミングを指定できる

5.2 :ifや:unlessでProcを使用する

Procを使用すると新しいメソッドを定義することなく条件を記述することが可能

if:

validates :phone, presence: true, if: :aaa

def aaa
   x == "aaa"
end

errorsの追加

errors[:base] << "この人物は以下の理由で無効です..." [:base]は配列でメッセージを保存する

参考

Railsバリデーションまとめ - Qiita

【パーフェクトRails】バリデーションをクラスに分離する - ITの勉強をいろいろやってみたブログ

JISキーボードの英数、かなキーをコマンド扱いできるようにした

会社のPCと家のPCでUS、JISの違いがあり、 コマンドキーの位置でかなりストレスが溜まっていたので
ソフトウェアいれて解決させました。

Karabiner-Elementsの本家が「英数/かな」の切り替えに対応したみたい - Qiita

かなり便利なやつがあったので、インストールして 上記のブログで書いてある通りに設定して完了