寄り道じゃなくて道草

逃げたり諦めることは一瞬あればできる

Rubyでの真偽値を返すメソッド名の命名について

仕事でソースレビューをしてもらった際に知った命名についてです

調べたら一般的な話でしたが、恥ずかしながら知りませんでした

メソッド名はis_で始めず最後に?を付ける

結論は見出しの通りなのですが、

メソッド名はis_で始めず最後に?を付ける

ということです

真偽値を返す時はisから始めるというのをどこかで知ってずっとそうしていたのですが、

(リーダブルコードでそんな記述を見た気がする...)

Rubyの慣習では違ったみたいです

最後に

レビューして指摘していただいが方には感謝です

一度RubyRailsのスタイルガイド的なものを読んでみてこういった慣習を把握してみようと思います

GithubでAchievementsをGetした話

一緒に仕事をしている人のGithubのプロフィールをふと覗いたときに、Achievementsなるものを発見してしまいました

ゲームが好きな自分としてはこういった称号は気になるし欲しくなってしまうもの

なのでGetしました!とりあえずすぐに手に入る簡単なものから

Achievements とは?

以下が公式の説明になりますが、ある一定の条件をクリアするとAchievementsがもらえるようです

github.com

注意点

取得してみて分かったのですが、リポジトリの設定がpublicになっていないとカウントされずAchievementsが取得できないようでした

仕事でも自学でもprivateで行なっていたので手に入っていない訳です

今回取得したAchievements

今回取得したAchievementsは、「Pull Shark」と「Quickdraw」の2つをGetしました!

Pull Sharkは、Pull Requestを2回マージすることで手に入ります

また、QuickdrawはIssueもしくはPull Requestを作成して5分以内にCloseすると手に入ります

最後に

ちょっとしたものですが称号的なものを入手できるとモチベーションが上がりますね

docker-composeで「A server is already running. Check /app/tmp/pids/server.pid.」が発生したので対処法

おそらく前回dockerを立ち上げたまま終了してしまったのか、

docker-compose upをした際に、

「A server is already running. Check /app/tmp/pids/server.pid.」

というエラーが発生してしまいました

調べたら簡単に治せたのでメモしておきます!

「A server is already running. Check /app/tmp/pids/server.pid.」の対処法

docker-compose.ymlファイルのcommandのRails立ち上げコマンドの前に

rm -f tmp/pids/server.pid &&を追加してあげるだけです

command: bash -c "bundle exec rails s -p 3000 -b '0.0.0.0'"

↓に変更
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"

一度立ち上げ直した後は、

元のコマンドに戻してあげてもいいし、

そのままにして同じ現象が起きないようにしてあげるでも良いかもしれません

参考

qiita.com

ActiveRecord::RecordNotSaved - Failed to save the new associated xxx.:が発生したときの解決法

ActiveRecord::RecordNotSaved - Failed to save the new associated モデル名.:

が発生し解決に少し時間かかったのと、

エラーでググっても同じ問題で発生している人が見当たらなかったので、メモしておきます

結論

とりあえず結論

関連テーブルをnewで作成しつつ代入し用途した際に、newで作成失敗しエラーが発生したみたいです

これだけだと分かりづらいので説明していきます

ソースを使って詳しく解説

まずは前提

Blogというモデルがあり、それに対して1対1で紐づくOwnerがあったとします Blog作成後にのupdateでBlogに紐づくOwnerを作成して一緒に紐付けを行うという処理になります

class Blog < ApplicationRecord
  has_one: owner

end

class Owner < ApplicationRecord
  belongs_to: blog

end

class BlogsController < ApplicationController

  def update
    @blog = Blog.find(params[:id])
    if !@blog.owner
      @blog.owner = Owner.new(
        name: params[:name],
        email: params[:email]
      )
    end
  end

end

仕様追加で処理を追加

仕様が追加され、新しくCompanyテーブルを作成しOwnerを紐付けました

class Blog < ApplicationRecord
  has_one: owner, dependent: :destroy

end

class Owner < ApplicationRecord
  belongs_to: blog
  belongs_to: company # 新しく追加

end

# 新しくCompanyモデルを追加
class Company < ApplicationRecord
  has_many: owner

end

class BlogsController < ApplicationController

  def update
    @blog = Blog.find(params[:id])
    if !@blog.owner
      @blog.owner = Owner.new(
        name: params[:name],
        email: params[:email]
      )
    end
  end

end

エラー発生

この状態で動かしたら以下のようなエラーが出ました

ActiveRecord::RecordNotSaved - Failed to save the new associated owner.:

@blog.owner = Owner.new(でエラーが出ているということは、エラーの詳細内容で分かったのですがパッと原因が分からず

なので一旦newして変数に入れてから紐付けを試してみたり、newする時の渡す値を変えたり変更したりと試している中でやっと原因らしき情報を手に入れました

Owner.new(だったのをOwner.create!(に変更したときに、comanyを入力してくださいという、エラーが発生

原因判明

原因はOwner.newする際に一緒にcompanyを渡していないことが原因でした

先日書いた以下の記事で説明しているのですが、

belongs_to: company, optional: trueであれば、companyをしていなくてもエラーにはならないのですが、

今回は必ず設定して欲しかったのでoptional: trueは設定していませんでした

tchkmch.hatenablog.com

Owner.newでエラーが発生し、それが原因で@blog.owner = Owner.new(にてエラーになっていたようです

以下のようにcompanyを設定してあげるようにしたら無事動くようになりました!

class BlogsController < ApplicationController

  def update
    @blog = Blog.find(params[:id])
    company = Company.find_by(params[:comapny_id])
    if !@blog.owner
      @blog.owner = Owner.new(
        name: params[:name],
        email: params[:email],
        company: company # OwnerにCompanyへの紐付けを追加
      )
    end
  end

end

最後に

ちょっとしたことでハマることってたまにあるんですよね

同じようなケースがググっても見つからなかったのでハマる人は少ないのかもしれませんが、同じようにハマった人の参考になれば幸いです

Railsで範囲オブジェクトを使った検索

検索条件で、ある値より大きいや小さいといった条件で検索したくなることがある

Railsでそれを実現する方法になります!

以上

以上は「.」を3つで表現することができます

上限と下限あり(1以上5以下)
Test.where(result: 1...5)

上限なし(1以上)
Test.where(result: 1...)

下限なし(5以下)
Test.where(result: ...5)

未満

未満は「.」を2つで表現することができます

上限と下限あり(1以上5未満)
Test.where(result: 1..5)

下限なし(5未満)
Test.where(result: ..5)

未満はありますが、超過(より大きい)は、なぜかないようです。

なので、超過(より大きい)を表現するためには、

Test.where('result > ?', 1)

というように、SQL分で条件を書いてあげる必要があります

参考

docs.ruby-lang.org

belongs_toのoptional: trueの意味

Railsのソースを読んでいて、以下のような記述がありました

belongs_to :company, optional: true

完全に忘れていたので、未来の自分のためにメモしておきます

belongs_toのoptional: trueとは?

外部キーがnilでも許可するという意味です

同じ記事を開いた形跡があったので、前にも調べたのに忘れていたようです

使用例

例えば、

class User < ApplicationRecord
  has_many: posts
end

class Company < ApplicationRecord
  has_many: posts
end


class Post < ApplicationRecord
  belongs_to :company, optional: true
  belongs_to :user, optional: true
end

上のような定義があり、

Userが追加した記事のデータもCompanyが追加した記事のデータも同じPostテーブルに保存されるとします

Postテーブルに保存されているデータには、Userに紐づいているものもあれば、Companyに紐づいているものもありますが、

UserとCompanyの両方に紐づいていることはありません

この場合、Userに紐づくPostのデータには、user_idが保存されていますが、company_idはnilになります

もし、optional: trueをつけていなかった場合、company_idがnilだとエラーになります

このような時にoptional: trueが必要になってきます

参考

blog.ryskit.com

「チ。ー地球の運動についてー」を読んだ

「チ。ー地球の運動についてー」が3巻くらいまで無料で読めたので興味本位で読んでみたのですが、

予想以上に面白かった

名前は知っていた

以前「マンガ大賞」の受賞作品として選ばれていたので、話題になっており名前と「地動説」についての漫画であることは知っていました

漫画喫茶でパラパラと見た感じ絵柄と作風で、自分には合わない感じかなと思い読んでいなかったのですが、そんなことはなかった

あらすじ

15世紀前半のヨーロッパの「P王国」では、「C教」という宗教が中心となっていた。地動説は、その教義に反く考え方であり、研究するだけでも拷問を受けたり、火あぶりに処せられたりしていた[5]。その時代を生きる主人公・ラファウは、12歳で大学に入学し、神学を専攻する予定の神童であった[6]。しかし、ある日、地動説を研究していたフベルトに出会ったことで地動説の美しさに魅入られ、命を賭けた地動説の研究が始まる。

引用元: チ。-地球の運動について- - Wikipedia

この作品の魅力

次はどうなるんだろうという気持ちに毎回させてくれる

死ととなり合わせのストーリーなので、読んでる方もハラハラする展開が多いが、

それと同時に次はどうなるんだ?と続きが気にさせてくれる

出てくるキャラクターの気持ちが熱い!

「地動説」は作品の時代上、「異端」という存在であり命懸けの研究になるのですが、それでも命を賭けてでも真理を知ろうとする姿

また、自分では辿りつけなくても次に繋げるという気持ち

熱い!

アニメ化が決定

また、アニメ化が決定しているようです

拷問のシーンもあり抵抗がある方もいるかもしれませんが、アニメならそういった部分は控えめになると思うので

アニメで見るのも良いかもしれません

最後に

確かに拷問のシーンもあり万人受けする作品ではないのかもしれません

ただ、そこはパラパラと飛ばしてもらっても十分楽しめる作品ではあると思います

読み進めていくごとにどんどん次が読みたくなる作品だと思うので、まずは1巻だけでも読んでみることをおすすめします!