SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

update_attributesとupdate_columnsの違い【Ruby on Rails】

Ruby on RailsのTutorialで使用されている、update_columns
そして似たような処理に見える update_attributesがあります。

この二つの違いについて調べてみたことをまとめます。

検索するとqiitaの以下の記事がでてきますね。
どうもこちらの記事によるとバリデーションやコールバックの違いがあるようです。
ActiveRecord の attribute 更新方法まとめ - Qiita

しかし!
最近よく言われますが、公式ドキュメントを参照するのが一番です。
なに?英語が読めない?
読めるようになればいいだけです。 そして読めるようになるには、読む練習が必要です。(自分に言い聞かせる)

ということでこちらも目を通しましょう。

ActiveRecord::Persistence

公式ドキュメント

update_attribute(name, value)

  • Validation is skipped.
  • Callbacks are invoked.
  • updated_at/updated_on column is updated if that column is available.
  • Updates all the attributes that are dirty in this object.

これは,

  • ヴァリデーションはされません
  • コールバックは呼ばれます
  • updated_atか_onのカラムが利用可能であれば更新されます
  • dirty,検知が可能である(変更があったかどうかがわかる) という風に書いていますね。

太字の二つは他のメソッドと異なる場合が多いので注目ですね。

update_attributes(attributes) / update(attributes)

こちらは上記のsがないバージョンですね。
updateは、エイリアスでupdate_attiributeと同様の処理となります。
動きが結構違うのでしっかりと見ておきましょう。

  • ヴァリデーションが適用される
  • コールバックが呼ばれる

ここがポイントです。
また、複数のカラムを同時に更新できるため、タイミングを同じタイミングで更新したいカラムがある場合にはこちらを使用します。

update_columns(attributes)

最後に、update_columnsです。 Rails Tutorialででてきましたね。

公式ドキュメントによると、

-validations are skipped. -Callbacks are skipped. -updated_at/updated_on are not updated. -However, attributes are serialized with the same rules as ActiveRecord::Relation#update_all

とのことです。

  • ヴァリデーションは適用されない
  • コールバックは呼ばれない
  • 更新の履歴は updated_atなどに残らない(更新されない)
  • update_allと同様にシリアライズされる

4つ目については、update_allの箇所で以下のように示されています。

However, values passed to update_all will still go through Active Record’s normal type casting and serialization.

キャストとシリアライズが行われる、となっていますね。 シリアライズというのは、配列のままDBに保存する時などに行われる変換のようです。

使用例

以下の2行の書き換え例ですね。 Tutorialでは、columnsを使っていました。

 update_attribute(:activated, true)
 update_attribute(:activated_at, Time.zone.now)
update_columns(activated: true, activated_at: Time.zone.now)
update_attributes(activated: true, activated_at: Time.zone.now )

まとめ

基本的にはvalidationとcallbackが行われる、
update_attributesを使用しましょう!

参考記事、URL

Rails Tutorial 11章,12章

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

bitcoinに大きな動き!今後どうなる?

伊豆大島へと旅行している間にbitcoinがかなり大幅にレートの変動がありました。笑

bitcoinの購入して直後になんてこったい・・・w

bitcoin

そもそもbitcoinってなんやねん!って人はこんな感じ。

ビットコインとは、インターネット上で取引や通貨発行(「採掘(マイニング)」と呼ばれる。) が行われる「分散型仮想通貨」のことです。 政府や中央銀行などの中央機関を介さず、また、P2Pネットワーク上で取引が行われるため、取引の仲介手数料が低く抑えられ、迅速に世界中のどこでもだれとでも貨幣取引を行うことができます。

引用元 : ビットコインの解説 | Bitcoin日本語情報サイト

といっても自分もそこまで詳しいわけではありませんので、あしからず。

いろいろVALUというサービスが出てきたり、仮想通貨やブロックチェーンなどに興味はあったので、じゃあとりあえずやってみるか、と入金して購入してみていました。

売り買いでどんな感じだろうなーと。
株もやったことがないので、ある意味初めての取引経験となりました。

bitcoinは1bitcoinが28万程度で取引されるほどになっていました。 自分が買ったのは、27万くらいのレートの時。

すると旅行へレッツゴーと、出かけているとtwitter暴落っていう文字が踊っており、確認するとえらいこっちゃ!
現在は22万円ほどまで変動しているみたいですね。 数%の変動とかいうレベルの変動じゃありません。

これは、、、ある意味チャンスなのでしょうか・・・(わからない勢)

3連休

人生最初で最後の社会人3連休であったため、旅行に!

東京から2泊くらいできて、この後の夏旅行に備えてそれなりの費用で楽しめる場所を友人と探すと、
「島いいんじゃね?」と提案してくれ、いろいろあって行くことができました。

実は、ネット情報で確認した時は満席だったのですが、電話確認でチケットがあいている!と。
ということで当日にチケットを確保し、宿もなにもかも決めずにバックパック1個しょってレッツゴー。

最悪宿がなくても公園で寝ようスタイルですね。笑

すると、なんやかんやでレンタカーがみつかって車中泊するかぁーと温泉行ったりラーメンすすっていると、
現地の人と出会っていろいろ話しているうちに「宿ないならうちにくるかい。」的な流れでまさかのお泊りさせていただくことに 。

なんてこともあり、思い出に残る旅になりました。

いきあたりばったりって、よくないことも多い(と、捉える人が多い)ですけど、自分は結構好きですね。
結果論でしょうけど、その場その場で体感できる体験がめっちゃおもしろいです。

伊豆大島で一番の見所は!と言われると、「裏砂漠」と呼ばれる砂漠地帯がかなりおすすめ。
そうそう日本じゃみられないような光景を目にすることができます。
要レンタカーで車でブイーンといけるポイントにあるので、地図を片手に行ってみてほしいです。

RSpecを導入してRails TutorialのMailerのプレビューを確認する方法

Rails TutorialをRSpecを導入し、11章のMailerの部分でのエラー対処について minitestではないため、対応が必要となります。

進めていると、Mailerのpreviewの時にエラーが発生していしまいました。

http://localhost:3000/rails/mailers/user_mailer/account_activationにつないでみるとこのようなエラーがでています。

uninitialized constant UserMailerPreview::UserMailerMailer
  # Preview this email at http://localhost:3000/rails/mailers/user_mailer/account_activation
  def account_activation
    UserMailerMailer.account_activation
  end

  # Preview this email at http://localhost:3000/rails/mailers/user_mailer/password_reset

このエラーの原因は、
test/mailers/previews/user_mailer_preview.rbにあるファイルを変更しているためにエラーです。

user_mailer_preview.rbは、 spec/mailers/previews/user_mailer_preview.rbにあるファイルを置き換えましょう。 specをたどるようになっているはずですので。

bitcoinが大きくバケるか?

bitcoinでの取引、始めました。

ちょっとずつ額を増やしつつ成長してほしいもんです。笑 最初知識入れないとなんともっていうところですけど、とりあえずやってみたという経験が大事だと思うので!

エンジニア研修の方は、必死にサービス開発をがんばっております。 ユーザ認証周りが、結構理解していないと作るのが大変ですね。

Ruby on Railsのtutorialはほんとにすごいなーと復習しつつ実装中。

今日はお昼と晩飯におそばを食べてしまいやした。 そばdayだな。

そしてやっと風邪がなおってまいりまして、体調が回復傾向に。 体が元気なだけでかなり楽だなぁ。健康はかなり大切。

技術的なやっていることをまとめる時間がほしいなーなんて思いつつ、どっかでスケジュールにいれないとやらないね。笑

RSpec最初のdescribeの命名規則

RSpecの1行目の書き方のメモ。

基本的には自動生成されるので困るポイントではないと思いますが、
requestsのスペックなどを書こうと思うとこちらの知識が必要になるかもしれません。

RSpec.describe User, type: :model do

この部分のUserとかは、 クラス名を書きます。

コントローラであれば、
RSpec.describe SessionsController, type: :controller do
という感じ。

それぞれファイルの1行目を見ることでチェックが可能です。

要は、このspecは、何をテストしますよ、という明示となるわけですね。

ちなみに、
describe 'Sessions', type: :request do
のように、 ' 'でくくってあげると任意の文字列で表現してあげることができるようです。

風邪を引き始めたら

結構悪化していましたが、なんとか乗り越えられそうです。
風邪というか、疲れ的な感じでした。

体調悪化の対処方法

まずはポカリ、ウィダーをがぶのみして寝ます。
ちょっと汗かく感じで布団をかぶって寝ます。

まだ治らない

それでも治らない場合はベンザブロックも併用します。
さらに、睡眠時間を1,2時間増やします。

とにかくポカリ飲みながら寝ます。

まだまだ治らない

病院へ行きます。

病院へ行った、という思い込みで基本的には良い方向へ向かいます。

そして病院でもらえる薬は市販のものよりも強力であるため、効きます。

寝ます。

以上で

治ります!!!!!

今回は鼻水が滝のように出ていて、結構きつかったのですが、なんとか治りそうです。
しかも耳が遠くなってましたw
鼓膜的なのが張っていない感覚になっておりました。重症かて。

割と社会人で体調崩すと、業務後に空いている病院を探すのも大変だし、
東京のお医者さんはなんだか冷たく、作業感を感じるし(早くていいけど)
不便で大変だなーと思うところ。

荷物の受け取りとか、ご飯とか、病院とか夜に社会人用にやっていてほしいものです。 もちろん働く人も大変だけど、普通に需要あるよなぁ、と。

体調悪かったらおやすみいただいて病院いけっていうのもありますが。笑