@ledsun blog

無味の味は佳境に入らざればすなわち知れず

ActiveRecord

Rails 7のload_async

Rails 7の新機能を見ていて次の機能があることに気がつきました。 Ruby on Rails 7の主要な新機能・機能追加・変更点 - Qiita ActiveRecord::Relation#load_asyncを使用することによって、非同期でSQLクエリを実行し、結果を取得することができるようになり…

activerecord-importを速くつかう

速度を計測する簡単なスクリプトが手に入りました。 計測しやすくするために、よりシンプルに変更します。 class User < ApplicationRecord class << self def benchmark_bulk_insert # create data instances = [] 1_000.times { instances << new(name: 'n…

ActiveRecordのバルクインサート比較 その2

Railsコンソールで実行するとログが出てきて面白いです。 読みやすくするためにデータ件数を3件、試行回数を1回にして実行します。 user system total real sql TRANSACTION (0.1ms) begin transaction (0.2ms) INSERT INTO users (name, created_at, update…

ActiveRecordのバルクインサート比較 その1

手始めにRails6で追加されたinsert_allとimport(とその他)のパフォーマンス検証 - Qiita を追証します。 次のように検証用のRailsアプリケーションを用意します。 bundle exec rails new . bulk_insert -MCAJT bin/rails g user name:string bin/rails db:pr…

PostgreSQLのインデックスが肥大化するとInsertがおそくなる

先月末からJSONファイルからDBに一括取り込みする処理の高速化をしています。 activerecord-importを使っていたので、つぎの方法を試しました。 activerecord-importに渡すデータ生成のチューニング ActiveRecordインスタンスからハッシュに変更 ActiveRecor…

ActiveRecordでjoinする練習

Railsをcloneしてきたリポジトリでirbを使って練習します。 ~ bundle exec irb -r active_record class Organization < ActiveRecord::Base; end class User < ActiveRecord::Base; belongs_to :organization; end ActiveRecord::Base.establish_connection(…

activerecord_uml

gistのURLを覚えることは不可能なので、ActiveRecordを継承したクラスのクラス図を描くRubyスクリプトをgemにしてみました。いまのところrubygemsには公開していません。 github.com bundle installすると次のように呼び出せます。 ~ bin/rails runner Activ…

ActiveRecordを継承したクラスのクラス図を開くワンライナー

curl -s https://gist.githubusercontent.com/ledsun/76d5485644685f19c98f88000a971d00/raw/ec1251e6b00cda7d9c350178dc445052e87a3e21/class_diagram.rb | bin/rails runner - Computer | browser 実行するとこういう感じです。 gyazo.com 種を明かします…

ActiveRecordを継承したクラスのmermaid.jsクラス図を作るワンライナー

curl https://gist.githubusercontent.com/ledsun/76d5485644685f19c98f88000a971d00/raw/a1aa3df955ee8829b7041c1c6cda11610978d393/class_diagram.rb | bin/rails runner - Computer 実行すると次の感じです。 ~ curl https://gist.githubusercontent.com/…

ActiveRecordを継承したクラスからUMLクラス図を作る

DBの情報からER図を生成するツールはいくつかあります。 またUMLを生成するツールもあります。 同じような感じで、UMLをActiveRecordから取得します。 この手法の利点はメソッド情報がとれることにあります。 model_name = ARGV[0] class_name = Object.cons…

引数で受け取ったクラス名からActiveRecordを継承したクラスを作る

require 'active_record' model_name = ARGV[0] Object.const_set model_name, Class.new(ActiveRecord::Base) 参考 Object::ARGV (Ruby 3.0.0 リファレンスマニュアル) ruby - Dynamic Class Definition WITH a Class Name - Stack Overflow

既存のRailsプロジェクトからカラム情報を取得する(成功)

config/database.ymlを直接読み込むと"pool"=>"<%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>"という謎の情報が取得され、正しいデータベースへの接続情報が得られません。 <%=と%>はeRubyスクリプトです。 Railsアプリケーションなdatabase.ymlは厳密には…

既存のRailsプロジェクトからカラム情報を取得する(原因)

既存のRailsプロジェクトなので、rails consoleで使用しているデータベースへの接続情報を見れば原因がわかるはずです。 ~ bin/rails console Running via Spring preloader in process 24178 Loading development environment (Rails 6.1.3.2) irb(main):00…

既存のRailsプロジェクトからカラム情報を取得する(失敗)

一般的なRailsアプリケーションはconfig/database.ymlにデータベースへの接続情報があります。 これをつかってすでに存在しているデータベースからカラム情報を取得してみましょう。 必要なライブラリを読み込んでirbを起動します。 ~ irb -r 'active_record…

annotate gemっぽいrake taskを作る

RailsアプリケーションのModelクラスのコードにDBのテーブルで定義されているカラムの情報を追加してくれる便利なGemがあります。 github.com ソースコードに書いてしまうとDRYでないので、必要な時に計算する方法を考えてみます。 rake taskとして実装する…

ActiveRecordからカラムの型情報を得る

次のスクリプトで、テーブル定義とActiveRecordクラスを用意します。 ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") ActiveRecord::Schema.define do create_table :employees do |t| t.string :name t.integer :age …

ActiveRecordのcreated_at, updated_atの時刻を固定値にするモンキーパッチ

class ActiveRecord::Base def self.current_time_from_proper_timezone Time.local(2008, 9, 1, 10, 5, 0) end end https://github.com/rails/rails/blob/817148a7472413b31b3334c20fc08c6da5ffc68a/activerecord/lib/active_record/timestamp.rb#L77-L79 …

ActiveRecordインスタンスのInteger型カラムのデフォルト値のbefore_type_castは文字列

require "active_record" ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") ActiveRecord::Schema.define { create_table(:users) { _1.integer :age, default: 20 } } class User < ActiveRecord::Base; end u = User.n…

RDBを使わずにActiveRecordのインスタンスをつくる

ActiveRecordのソースコードを読みたいです。 プログラムのソースコードを読むときは、実際に動かしてみて、動きを追っていくと理解が早いです。 ActiveRecordはデータベースのスキーマ情報を元にインスタンスをつくります。 単にPost.newを実行しても次のよ…

ActiveRecordのソースコードを読む

Ruby on Railsを使ったアプリケーション開発で、DBにMySQLを使いカラムの型定義がIntegerの時にデフォルト値が文字列で設定される現象を観測しました。 デフォルト値だけ見て型をみないことに疑問を感じました。 そこでActiveRecordのソースコードを読みまし…