This page looks best with JavaScript enabled
⚠️

【Ruby/Rails】業務で得た小技まとめ

 ·   ·  ☕ 2 分で読めます
✏️

自分が指摘されたり、書いてあるコードを見て「なるほど〜〜」と思ったやつ。

フルネーム表記の仕方

1
2
3
"#{last_name} #{first_name}"
# じゃなくて
[last_name, first_name].compact.join(' ')

「1対多(0)もあり」のときに、has_manyが0のときに404にする

例えば、users/:id/tagsとかのとき、該当のuserがtagsを持っていないときがある。
そんなときはテンプレートでNoMethodErrorになったりする。そもそも、NotFoundで404ページを出したい。

そんなときはこれ。

1
@user = User.joins(:tags).find(params[:id])

joinsはinner joinを行うので、tagsを持たないusersレコードは引っかからなくなる。
そのため、ActiveRecord::RecordNotFoundをraiseする。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[32] pry(main)> User.joins(:tags).find(4)
  User Load (1.0ms)  SELECT  `users`.* FROM `users` INNER JOIN `registered_tags` ON `registered_tags`.`user_id` = `users`.`id` INNER JOIN `tags` ON `tags`.`id` = `registered_tags`.`tag_id` WHERE `users`.`id` = 4 LIMIT 1
ActiveRecord::RecordNotFound: Couldn't find User with 'id'=4

[33] pry(main)> User.find(4)
  User Load (2.1ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 4 LIMIT 1
=> #<User:0x00007fab64c255a8
 id: 4,
 twitter_id: "hoge",
 uuid: "5zrm-XBdKyNB",
 name: "hoge",
 description: "",
 privacy: "published",
 role: "general",
 created_at: Tue, 26 Jan 2021 23:19:37 JST +09:00,
 updated_at: Tue, 26 Jan 2021 23:19:37 JST +09:00,
 screen_name: "hoge",
 avatar_url: "https://pbs.twimg.com/profile_images/1267362108703817728/bSK1Ux-E.jpg">

ActiveRecordからハッシュを作る

1
2
3
4
5
[1] pry(main)> user = User.last
  User Load (7.0ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<User id: 1, name: 'END', created_at: "2022-05-20 17:24:26.000000000 +0900", updated_at: "2022-05-30 19:25:12.000000000 +0900">
[2] pry(main)> user.slice(:id, :nickname)
=> {"id"=>1, "name"=>"END"}

slice (ActiveRecord::Core) - APIdock

database.ymlの設定を元にDBに接続する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
default: &default
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_bin
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: hogehoge
  password: password
  socket: /tmp/mysql.sock
development:
  <<: *default
  database: hogehoge_development

のようなymlの場合は、mysql -u hogehoge -ppassword hogehoge_developmentで接続できる。
しかし、実際にdatabase.ymlを参照して接続するのは面倒くさい。Railsでは、以下のようなコマンドで接続できる。

1
2
bin/rails dbconsole
bin/rails db
Share on

END
END
@aiandrox

 
目次