トップ画像イメージ

今年も終わりだし、Railsで良く使っていた手法を復習がてらまとめておきます

今年1年間Railsとjqueryを使って業務システムを開発していました。復習がてら、これは良いやと思ったことをまとめておきたいと思います。

ActiveRecord + SQL編

RailsでSQL文を書きたい時用。 こんな時にActiveRecordではなく、素のSQLを書きたい。

  • ちょっと複雑なwhere文を書きたい
  • 色んなテーブルを結合して、結果を1列に横に並べて利用したい(ActiveRecordだとeachのネストが深くなるので、ループが長くなる)

①find_by_sql

#例えばこういうSQLを書きたい時

sql=<<~SQL
    SELECT id, code, code_name 
    FROM codes
    WHERE code_kbn = 'gyomu_cd'
        AND code in (
        SELECT regexp_split_to_table(gyomu_codes, ',')
            FROM groups
            WHERE id = '#{current_syozoku.id}'
        ) 
    SQL

#find_by_sql
records = Group.find_by_sql(sql)
#返り値はActiveRecordのインスタンスなので、ActiveRecordの恩恵を受けられる

②ActiveRecord::Base.connection #execute

#上と同じようなSQL文を用意

sql = "SELECT ~ "

arb = ActiveRecord::Base.connection
result = arb.execute(sql)

#返値はSQLの結果なので、結合したテーブルも1行になって帰ってくるので、eachのネストが深くなったりすることは防げる

③eager_load,includes

records = Group.where.not(group_name: nil).eager_load(:users :codes)
#groupsテーブルが左側のレフトアウタージョーイン。結果をキャッシュしてくれる。

records = Group.where.not(group_name: nil).incluedes(:users :codes)

これについては、こちらの記事(ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い)で非常に分かりやすく説明してくれています。

④ その他(これは良いなと思ったsql文)

配列型ではなく、文字列型の列に','区切りで文字列が入っている。

↓こんな感じ

1,2,3

飯塚,豊本,角田

これをsplit関数みたいにして、特定の値がこの中に含まれているのか確認したい時とか

-- こんな感じで返してくれる。
select regexp_split_to_array('列名',',') from users

=>{'角田','豊本','飯塚'}

-- これを利用して、帰ってきた配列に特定の値を含むか判定する
where '角田' = any(regexp_split_to_array('列名',',')) 

ControllerからViewに値を受け渡す

非同期通信で動的に画面を更新するときは、素直にajax等の技術を利用しますが、動的にページを更新する必要がない場合は、素直にControllerからViewに値を渡す。

その辺については、こちら(サイト内別記事)にまとめています。

一方、動的にページを更新したい時。

ただテキストボックスや表示を変更するだけならともかく、Railsのpartial(部分テンプレート)を利用している部分を、丸っと変更したい場合。

jqueryではRailsのパーシャルをhtmlとして解釈できないので、Rails側でhtnlに変換して、文字列としてフロントサイドに渡してあげることができます。

その辺については、こちら(サイト内別記事)にまとめてあります。

デバッグ(binding.pry)

#Gemfile
gem 'pry-rails'

と記載してbundle install

コントローラーやビューにおいて、処理を止めながら、デバッグすることができるようになります。

#コントローラー
local_val = #何らかの処理
binding.pry

#binding.pryと記載したところで処理が止まり、変数の中身などを確認しながらデバッグできる。ブレークポイントは複数設定できる。

コントローラーだけでなく、このようにviewの処理も止めることができます。

<ul>
<% local_vals.each do |val| %>
  <li>
      <%= val %>
      <% binding.pry %>
  </li>
<% end %>
</ul>

フロント側の処理(javascript)

正直、ES2017どころかES2015の書き方も理解していなかったので、配列処理は全てfor文で実行しているところから始まっていましたが、ES2015(ES6)の書き方を勉強して、かなりコードを分かりやすく書くことができるようになりました。

配列の便利メソッドについては、こちらの記事(サイト内別記事)にまとめています。

正直これを知っておくだけで、相当楽になったのですが、jsのクラスっぽいものを覚えた時に、感動しました。

筆者の職場では、未だにfor文しか使っていない人も結構いるのですが、ブラウザが許すのであれば、ES6以降の書き方をしている方がシンプルに分かりやすく、書けますね。

以上、簡単ですが、こんな感じです。

次が50記事目で、ちょうど2019年も終わりですので、今年1年を振り返って、記事を書きます。