Tips Output vol.1
each_with_object
最近知ったメソッド。
最初ややこしいし、なんのために使うか分からなかった。
ユースケースとしては、
validのものとinvalidのものを仕分けたいときに使えそう。
返り値は、オブジェクト
users = [{ name: 'Taro', age: 18 }, { name: 'jiro', age: 20 }, { name: 'Hanako', age: 24 }]
result = users.each_with_object(valid: [], invalid: []) do |user, result|
if user[:age] > 20
result[:valid] << user
else
result[:invalid] << user
end
result
end.compact
p result
#=> {:valid=>[{:name=>"Hanako", :age=>24}], :invalid=>[{:name=>"Taro", :age=>18}, {:name=>"jiro", :age=>20}]}
Array#all?
配列の中身と引数やブロックの評価結果が真である場合にtrue
を返し、偽である場合にfalse
を返すメソッド。
例えば、
def calc(*numbers)
numbers.map do |n|
n * 2
end
end
same_result = calc(2, 2, 2)
p same_result.all?(4) #=> true
different_result = calc(2, 3, 4)
p different_result.all?(4) #=> false
Hash
でもいける。
person = { name: 'Sato' }
p person.all? { |_, val| val == 'Sato' } #=> true
is_a
レシーバが引数のクラス、もしくはそのクラスのサブクラスの場合にtrue
を返す。
Module#include
やObject#extend
やModule#prepend
によってサブクラスのインスタンスになる場合も評価される。
Sample code
class Sports
def initialize(name)
@name = name
end
end
class Baseball < Sports
def initialize(sum_teams)
@sum_teams = sum_teams
end
end
sports = Sports.new('baseball')
p sports.is_a?(Sports) #=> true
baseball = Baseball.new(20)
p baseball.is_a?(Sports) #=> true
Hash#delete
key
に対応する値を取り除く。
ブロックを渡すこともできて、このブロックはキーに対応する値がなかった場合に、評価される。
delete
メソッドが実行された後の、元のハッシュは取り除かれていない要素のみを持つ。
Sample code
user = { name: 'Taro', age: 20 }
p user.delete(:age) #=> 20
p user.delete(:address) #=> nil
p user.delete(:address) {|key| "#{key} is nothing."} #=> "address is nothing."
p user #=> {:name=>"Taro"}
Rake::Task#invoke
Rakeタスクの中から、別のタスクを呼び出すときに使う。
Rails.root.join
プロジェクトルートパスからパスを組み立てる。
Rails.root.join('hoge/fuga')
とすることで、Rootディレクトリから簡潔にファイルパスを取得できる。
irb(main):003:0> Rails.root
=> #<Pathname:/app>
irb(main):004:0> Rails.root.join('hoge/fuga')
=> #<Pathname:/app/hoge/fuga>
おまけ
デフォルトのRails.env
はdevelopment, test, productionの3つ。
興味深い記事
参考
Karnel.#system
引数を外部コマンドとして実行して、成功したときにtrue
を返す。
初めてこのコードに出会ったとき、戸惑った。
特にRubyでは#
がコメントの扱いをすることがほとんどなので、余計に。
# -*- mode: ruby -*-
# vi: set ft=ruby :
この2つは、ファイルに対して特定の編集モードを選択するようエディタに伝えるためのコードみたいだ。
ハイライトやインデント幅が適用されるようだ。
ft
はfile type
の省略みたいだ。
Array#filter
, Array#select
各要素に対して、ブロックの評価をした結果、true
になる要素のみを取り出して配列で返す。
true
になる要素がない場合は、空の配列を返す。
Sample code
empty_arry = []
result = empty_arry.filter do |i|
i % 3 == 0
end
p result #=> []
arry = [1, 2, 3, 5, 6, 9, 10]
result = arry.filter do |i|
i % 3 == 0
end
p result #=> [3, 6, 9]
find_each
は分割してレコードを1件ずつ取ってきて、それに対して処理を行うメソッド。
デフォルトでは1000件ずつ処理を行う。
Sample Code
[1] pry(main)> User.find_each do |user|
[1] pry(main)* p user.id
[1] pry(main)* end
TRANSACTION (0.4ms) BEGIN
User Load (9.7ms) SELECT `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL ORDER BY `users`.`id` ASC LIMIT 1000
2
3
5
6
7
8
10
11
12
13
14
15
16
17
18
19
done.
serializable_hash
これは、あるオブジェクトをシリアル化されたハッシュに変換するメソッド。
Sample Code
> user
#=> #<User id: 1, email: "test_user@example.com", created_at: "2022-07-30 13:03:02.019168000 +0900", updated_at: "2022-07-30 13:06:11.849681000 +0900">
> user.serializable_hash
#=> {"id"=>1, "email"=>"test_user@example.com", "created_at"=>Sat, 30 Jul 2022 13:03:02.019168000 JST +09:00, "updated_at"=>Sat, 30 Jul 2022 13:06:11.849681000 JST +09:00>}
done.
done.
done.
sort_by { |key, val| -key }.to_h
はいける?
done.
axios.get
と axios.post
の第二引数の書き方が違う。
Done.
Done.
vue composition API で document.querySelector
が動かない事象に対する対策
Done.
input
のタイプによって、イベントの発生タイミングが異なる。
要素にクラスがあるか確認するとき、省略記法がある?
Done.
Done.
precision
小数点を3桁(:scale
) と 整数を5桁 にしたいときは、precision
が8になる。
桁数をオーバーすると、保存時に以下のエラーが出る。
ActiveRecord::RangeError: Mysql2::Error: Out of range value for column 'occupancy_rate' at row 1
done.
filter_map