cancancanの内部の動きを追う

はじめに cancancan https://github.com/CanCanCommunity/cancancan 権限を一元管理できるgem。 とっても便利。 内部動作が気になったので追ってみます。 1: viewのcan? まず、viewのcan?が読み込まれます。 - if can? :buy, @product %h2 Anyone can buy P…

Rails: delegateを使ってモデルのフォームをすっきりさせる

delegate delegateを使います。 最近知ったRailsの便利なメソッド 指定したクラスのメソッドを簡単に呼び出せるようにしてくれます。 モデルの定義 schema create_table "accounts", force: :cascade do |t| t.integer "user_id" t.string "email" t.binary …

Rails: Referenceとforeign_keyの違い

referencesで”外部制約キーはつかない”とは、どういうことなのか? 参照整合性 参照整合性によって、テーブル(表)の列と列との依存関係を定義する。この依存関係において、参照する列を参照列(外部キー)、参照される列を被参照列と呼ぶ。参照列(外部キ…

RubyでつくるRuby

インタプリタの実装は難しいものではない。そんなに 作者は、Rubyコミッターの、遠藤侑介さんです。 あとがきにも書いてありますが、 すでにRubyや他言語のプログラミングを知っている方に、「インタプリタの実装」というのはそんなに難しいものではない、と…

ActiveStorage : N+1問題を回避しよう

Active Storage の N+1 Recipeモデルがあります。 カラムはnameと、ActiveStorageと関連付けられたavatar。 ActiveStorageは、モデルの中にimageが保存されるわけではなく、 active_storage_attachmentsテーブルとactive_storage_blobsテーブルとの 関連付け…

Rubyで駅データのラッパーを書いた。

API 駅データ.jp ( http://www.ekidata.jp/ ) が提供するAPIのruby wrapperです。 以下の3つのAPIをyamlデータととして使います。 都道府県API: http://www.ekidata.jp/api/api_pref.php 路線API: http://www.ekidata.jp/api/api_line.php 隣接駅API: http:…

activerecord-causeをforkして、クエリ実行時間が長いものを保存できるようにしてみた

activerecord-cause RailsのActiveRecordのログを見やすくするgemです。 GitHub - joker1007/activerecord-cause: This gem logs where ActiveRecord actually loads record クエリの実行時間が遅いものをデータベースに保存 activerecord-causeのログがキレ…

activerecord-causeを詠む

activerecord-cause? github.com ActiveRecordの読み込みが実際にトリガーされた場所をログに記録するgem ActiveRecordは必要になるまでDB読み込みをしません。 なのでやたら複雑なビューの中でクエリを弄ったり、コントローラーが肥大化してる状態でひどいS…

gimeiを詠む

gimei? github.com gimei は、日本人の名前や、日本の住所をランダムに返すライブラリです。テストの時などに使います。似たようなライブラリにfakerがあります。fakerはとても優れたライブラリで、多言語対応もしていますが、ふりがな(フリガナ)は流石に対…

stateful_enumを詠む

stateful_enumの内側をみる github.com 使い方に関しては以下の記事が参考になるかもしません。 Rails の 有限オートマトン この記事ではstateful_enumを詠んでいく過程で、個人的に気になった部分に焦点を当てて掘り下げていきます。 メソッドがoverideされ…

action_args: prependでコントローラーのsend_actionをoverrideしたもの

action_args github.com 使い方は以下の記事などを参考にしてください。 ActionArgsが素晴らしい件 #Rails この記事ではaction_argsの内側を見ていきます。 1. Contorollerのアクションが呼ばれる Railsはどのようにテンプレートを見つけているか send_actio…

Active Recordのキャッシュについて

Active Recordはどのように動いているのだろう? AdequateRecord Pro™: Like ActiveRecord, but more adequateより参照 1: ActiveRecord::Relationのインスタンスを生成します。 2: ARel::NodeにActive Recordにより変換されます。 GitHub - rails/arel: A…

RailsとSQLとNULL:恐怖のUnkown

恐怖のunknownとは? SQLアンチパターンで紹介されている、SQLのnullの挙動に関する誤解から生じる問題が引き起こす nullに対するプログラマーの恐怖を意味します。 nullではないカラムを検索する Nullnullという名前のテーブルを作ります。 rails g model N…

セレクトボックスのアンチパターン

データベースへのアクセスがあるかどうか? データベースへのアクセスがない場合はこんな感じのviewファイルになるかと思います。 この場合、特にハマりどころは無いように思います。 <select name="example"> <option value="1">さんま</option> <option value="2">イカ</option> <option value="3">たこ</option> </select> 問題となるのはデータベースを利用して、セレクトボ…

RailsのDB設計:小数点をあつかう場合のアンチパターン

ラウンディングエラー(丸め誤差) SQLアンチパターンという本でも紹介されているメジャーなアンチパターンです。 RubyのFloatの実装はC言語のdoubleなので、やはり丸め誤差は生じます。 10.0 / 3.0 => 3.3333333333333335 本当は3.3333....と続いてほしいの…

Rake入門

taskの依存関係を理解する 最初のサンプルなので、順を追って説明していきます。 ①単純なtask task :default => :daily_report desc "1日のトレーニング内容を記録する" task :daily_report do puts "レポートを作成しました。" end ・task :default => :da…

Ruby Style Guideを読んでの気づきリスト

はじめに Ruby Style Guide読んだ。 普段、自分がrubyを使っている時には意識できていなかった点をピックアップしていきます。 case文にインデントはいらない case when song.name == "Misty" puts "Not again!" when song.duration > 120 puts "Too long!" …

rbenvをアップデートして最新のruby(2.4.2)を入れる

方法 rbenvは既にインストール済みであることが前提です。 ① rbenv-updateをインストール rbenv-updateを使ってRubyのバージョンを上げたついでにRailsをインストールした(CentOS) gem: rkh/rbenv-update $ git clone https://github.com/rkh/rbenv-update…

GitHubへssh接続する

はじめに 参照:Connecting to GitHub with SSH GitHubへのリモートリポジトリからcloneする時は、ssh keyが必要に成ります。 ①SSH keys があるかを確認します。 $ ls -al ~/.ssh この時、下のいずれかが存在すればSSH keysは存在しますが、自分の場合は無か…

Debian8にrbenvでRubyとRailsを導入する

環境 以下の環境で行いました。 ・vagrant ・virtualbox ・box-url: https://app.vagrantup.com/debian/boxes/jessie64 Ruby with rbenv ①apt-getをアップデートする $ sudo apt-get update ②rbenvに必要なものをインストール $ sudo apt-get install autoco…

既存のGistをターミナルからアップデートする。

前提 ・GitHubアカウントを持っている。 ・GitHubでgistを作成し、存在する。 ・gemがインストールされている。 ※ちなみにgistをpublicで生成してもURLを知っていれば見えてしまうので注意しましょう。 参照:Private Gist の注意点 今回はGitHub上に以下の…