Rubyの多重代入 ,(カンマ)で区切られた代入の挙動

こんなやつが出てきて挙動が分からず困っていたら多重代入というやつらしい。

a, b = Hoge.moge

多重代入についてまとめます。

左辺が1つで右辺が複数の場合

配列に変換される

a = 1, 2 #=> [1, 2]
a #=> [1, 2]

左辺、右辺ともに2つの場合

左辺の各変数に右辺の各要素が代入される

a, b = 1, 2 #=> [1, 2]
a #=> 1
b #=> 2

左辺の数が多い場合

左辺の残りにnilが代入される

a, b = 1 #=> 1
a #=> 1
b #=> nil

右辺の数が多い場合

余った要素は無視される

a, b = 1, 2, 3 #=> [1, 2, 3]
a #=> 1
b #=> 2

他にも色んなパターンや使い方があるみたいですがこのへんで。。。

herokuでworkerだけをrestartする方法

heroku ps -a myapp

まずはプロセスを確認

$ heroku ps -a myapp
=== web (Standard-1X): bundle exec puma -C config/puma.rb (1)
web.1: up 2017/03/06 00:00:00 +0900 (~ 10h ago)

=== worker (Standard-1X): bundle exec sidekiq -C config/sidekiq.yml (1)
worker.1: up 2017/03/06 00:00:00 +0900 (~ 10h ago)

heroku restart worker.1 -a myapp

プロセスを指定して再起動

$ heroku restart worker.1 -a myapp
Restarting worker.1 dynos on ⬢ myapp... done

複数のworkerを同時に再起動する方法

$ heroku ps -a myapp
=== web (Standard-1X): bundle exec puma -C config/puma.rb (1)
web.1: up 2017/03/06 00:00:00 +0900 (~ 10h ago)

=== worker (Standard-1X): bundle exec sidekiq -C config/sidekiq.yml (3)
worker.1: up 2017/03/06 00:00:00 +0900 (~ 10h ago)
worker.2: up 2017/03/06 00:00:00 +0900 (~ 10h ago)
worker.3: up 2017/03/06 00:00:00 +0900 (~ 10h ago)

複数workerがある場合、下記のようにすれば一括で再起動。

$ heroku restart worker -a myapp
Restarting worker dynos on ⬢ myapp... done

constantizeした時にactive_support/inflector/methods.rb:268:in `const_get': uninitialized constant Hoge (NameError)と怒られる問題[Rails]

h = 'Hoge'.constantize
h.create(fuga: 'fuga')

した時に

active_support/inflector/methods.rb:268:in `const_get': uninitialized constant Hoge (NameError)

Hogeという定数、クラスがなかったため怒られてしまった。

safe_constantizeで回避

safe_constantizeを使うと存在しなかった場合 nil が返されます nilチェックしてから実行して回避

h = 'Hoge'.safe_constantize
h.create(fuga: 'fuga') unless h.nil?

rake taskの中断はreturnではなくnextだった[Rails]

task :test do
  puts 'hoge'
  return
  puts 'moge'
end

実行する

rake aborted!
LocalJumpError: unexpected return

怒られた…

rake taskの中断はreturnじゃなくてnextとのこと

task :test do
  puts 'hoge'
  next
  puts 'moge'
end

以下の場合はreturnとのこと

task :foo do
  do_something
end

def do_something
  puts "startd"
  return
  puts "end"
end

http://stackoverflow.com/questions/2316475/how-do-i-return-early-from-a-rake-task