2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

便利なrailsのTips

Last updated at Posted at 2024-12-30

はじめに

業務の中でためになったことを雑にまとめたものです。

コンテンツ

whereの条件を反転

invert_whereでスコープの条件の反転ができる。
注意点があるので複雑な条件の時は発行されるSQLを確認したほうがいい。

sample.rb
class User
  scope :enabled, -> { where(enabled: true) }
end

User.enabled
# enabled = falseを抽出できる
User.enabled.invert_where

Hash値およびキーワード引数の省略記法

Ruby 3.1から。
下記のように、同じ名前で変数名を定義すれば省略ができる。

sample.rb
dataA = "test"
dataB = "test2"
Model.where(dataA:, dataB:)

複数のデータを大量に保存する処理の時

activerecord-importというgemを入れてあれば、下記のようにimportを使ってパフォーマンスよく書ける。

sample.rb
tests = []
10.times do |i|
  tests << Test.new(name: "name_#{i}")
end

Test.import tests

あるテーブルのレコードのなかから最大値を取得

sample.rb
Model.maximum(:created_at)

条件を加えることもできる。

sample.rb
Model.where(flg: false).maximum(:created_at)

指定したテーブルに関連がないレコードのみを取得

relationが設定されていること前提です。
下記ではrelation_tableに登録のないModelのレコードを全て取得する。

sample.rb
Model.where.missing(:relation_table)

反対に関連があるものだけ取得したいときはjoinを使えば良い。

sample.rb
Model.join(:relation_table)

主キーのカラムデータを配列として取得

特定の条件に当てはまるレコード全てに対して何か処理を行う時などにパフォーマンスを考慮して使ったりする。

sample.rb
Model.ids

条件に応じてどちらかの値を返したい時

sample.rb
ret = (i > 0) ? i : 0
ret = [i, 0].max

カラム名でfind_by検索

下記の2パターンの書き方ができる。

sample.rb
find_by_name("テスト")
find_by(name: "テスト")

ハッシュから値を取り出す方法

下記のように書くことで、キーが存在しない場合のデフォルトの返却値を設定することができ、エラーを回避できる。

sample.rb
hash = {1 => 'a', 2 => 'b', 3 => 'c'}

# キーが存在するのでbがかえる
value = hash.fetch(2, 0)
# キーが存在しないので0がかえる
value = hash.fetch(4, 0)

ハッシュを合体する方法

下記のように書くことで、キーが重複する場合の処理を指定できる。

もし、keyが重複していた場合は、A_val(sampleAのvalue) + B_val(sampleBのvalue)の値を返すようにする。

sample.rb
sampleA = { a: 1, b: 2, c: 3 }
sampleB = { b: 3, c: 4, d: 5 }

result = sampleA.merge(sampleB) { |key, A_val, B_val| A_val + B_val }

自由にページを増やせる

コントローラーのアクションを増やさなくても、下記のように書けば、showアクションひとつのみで複数ページを設定できる。(静的ページを表示するだけのviewだけ増やしたい時に有効)

sample.rb
class TestController < AplicationController
  def index
  end

  def show
    render template: "test/#{params[:keyword]}"
  end
end

route.rb
namespace :test do
  get "/", action: "index"
  get "/:keyword", action: "show"
end

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?