Rails Model R - izudon/izudon.github.io GitHub Wiki

生SQL

方法は3つある。

  1. .execute クエリの実行
    • UPDATE文などの実行目的。結果取得には馴染まない。
    • ActiveRecord::Base.connection.execute()
  2. .select_all SELECT文の結果取得
  3. .find_by_sql Model オブジェクトの結果配列として取得。
    • Model.find_by_sql   * 背後では上述の select_all を呼んでいる。

【参考】Railsの生SQL概要:execute, select_all, find_by_sqlの使い方を覚える - Qiita

プレースホルダの利用

  • sanitize_sql_array メソッドやその仲間たちを用いる。
    • ActiveRecord::Sanitization クラスのクラスメソッドだが、
      ActiveRecord::Base クラスにインクルードされているので、
      ActiveRecord::Base.sanitize_sql_array() として用いることができる。
    • プレースホルダに値がインされた SQL文(文字列)が返る(もよう)。
      (なのでこの結果を select_allfind_by_sql などに渡す)。
    • Rails 5.2 以降は Model.sanitize_sql_array() などとして利用可。

クラス

ActiveRecord::Result

ActiveRecord::Relation

遅延実行

  • .select .where .group などで作成される参照系 SQL は、
    ActiveRecord::Relation オブジェクトとしてまずはビルドされ、
    結果が必要になったタイミング(ビューの中等)で発行されて値や配列になる。
  • .load とすればそのタイミング(その場所)で発行される。

インスタンス変数

内部状態を管理するために以下のインスタンス変数を用いている。

  • @values 条件等が格納。
  • @records SQLの結果が格納。
  • @loaded SQLを発行したか否かをこれで管理。
    loaded? メソッドで参照可 )

a