はじめに Rails 5 で ActiveRecord に待望の or メソッドが追加されましたね。これで where メソッドで SQL をベタ書きすることなく OR 演算子が使えます!ただ、where と or を組み合わせた場合、実際にどのような SQL が発行されるのかが気になったので検証してみました。 検証 前準備 以下の Model と seed データを用意します。
概要 ある配列を任意の長さ n ずつ分解したいです。 例えば、 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] を [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]] にしたいということです。 簡単にできるんです。そう Enumerable#each_slice ならね。 array = (0..10).to_a #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] array.each_slice(3).to_a #=> [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]] require 'active_support/core_ext/array/grouping' array = (0..10).to_a #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9
hash = { yuno: 'ゆの', miyako: '宮子' } hash[:yuno] #=> "ゆの" hash['yuno'] #=> nil hash = { 'sae' => '沙英', 'hiro' => 'ヒロ' } hash[:sae] #=> nil hash['sae'] #=> "沙英" きっちりしてて結構なんだけど、 key が文字列かシンボルか意識しなくても value を取り出せるとありがたい場合もありますよね。 そういえば、Rails 4 の Controller の params って文字列でもシンボルでも value を取り出せますよね。 あれの型は実は Hash ではなくて Hash のサブクラスである ActiveSupport::HashWithIndifferentAccess なんです! (正確には、さらにそのサブクラスである Action
each_with_index で index の値を利用する時、 たとえば 0 ではなく 1 から使いたい場合… %w(杏子 さやか マミ).each_with_index {|magica, i| puts "#{i + 1} #{magica}" } # 1 杏子 # 2 さやか # 3 マミ とわざわざ +1 を書いたりするのはなんか面倒だ (´・ω・`) そんなときは Enumerator#with_index(offset = 0) の出番! 見ての通り、offset 値に任意の数値を指定できるのだ! Array#each をブロックなしで呼ぶと、Enumerator 型のオブジェクトが返ってくるので、 そいつに with_index を呼んでやる。 パッと見、each_with_index に見間違えそうなくらい、そっくりに書けるのが (個人的には) COOL♪
# Rails 4.1.10 scope1 = User.where(sex: 'male', age: 18) scope2 = User.where(sex: 'female', age: 16) # 条件ごとに括弧をつけるために Arel::FactoryMethods#grouping を使う。 condition1 = User.arel_table.grouping(scope1.where_values.reduce(:and)) condition2 = User.arel_table.grouping(scope2.where_values.reduce(:and)) User.where(condition1.or(condition2)).to_sql #=> "SELECT `users`.* FROM `users` WHERE ((`users`.`sex` =
今 リファクタリング:Rubyエディション の輪読会をやっているんですが、 本日この本で知った小ネタをメモしておきます。 Ruby でインスタンス変数を遅延初期化するときには、 ||= というイディオムをよく使いますよね。 ここでの遅延初期化とは initialize (コンストラクタ) で事前にインスタンス変数を初期化しておくのではなく、 インスタンス変数に初めてアクセスする際に初期化することです。 class SoulGem def clearness @clearness ||= 100 end def get_polluted @clearness = clearness - 1 end end 初回のアクセスでインスタンス変数に値が代入され、以降のアクセスでは既に代入された値が返されます。 ただし代入された値が nil や false (すなわち偽) の場合は、毎回右辺の値が代入
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く