ウェブサービスを作っています。

実際の DB データをテストで使用する

Rails で開発していると、実際に使っている DB のデータを、テストで使用したい場合があります。

そのような場合、seed_dumpactiverecord-import を使ってうまく実現することができました。


Gemfile

group :development do
  gem 'seed_dump'
end

group :test do
  gem 'activerecord-import'
end

使わない環境では、gem を読み込まないようにします。


script/dump_models.rb

DUMPED_MODELS = [Site, Category, SubCategory]
OUTPUT_FILE = 'spec/fixtures/seed.rb'

DUMPED_MODELS.each_with_index do |model, i|
  options = {
    append: (i > 0),
    file: OUTPUT_FILE,
    exclude: [:created_at, :updated_at],
    import: true,
  }

  SeedDump.dump model, options
end

ダンプ用のスクリプトです。

モデルの関連を考慮して、DUMPED_MODELS の順番を決めます。

seed_dump のデフォルトでは id カラムが出力されませんが、モデルの関連があるので、id が出力されるように exclude オプションを調整します。

また activerecord-import を使うので、import オプションを true にします。


開発環境などでスクリプトを実行し、データをダンプします。

rails runner script/dump_models.rb

spec/fixtures/seed.rb にインポート用のファイルが出力されます。


最後に、RSpec で seed タグが設定されている example に対し、データがロードされるようにします。

spec/support/shared_context/seed.rb

RSpec.shared_context 'Importing seed' do
  before { load Rails.root.join('spec/fixtures/seed.rb') }
end

RSpec.configure do |config|
  config.include_context 'Importing seed', :seed
end

テストの例です。

describe FooJob, '#perform', :seed do
  it 'seed が設定されている' do
    expect(Site.count).not_to eq 0
  end
end

activerecord-import を使うとインポート速度が上がり、テストが速くなるので便利です。

ふるさと納税の返礼品検索サイト「ふるふる」を作りました

ふるさと納税の返礼品を検索できる「ふるふる」というサービスを作りました。

ふるふる

ふるさと納税のポータルサイトはいくつかありますが、

  • できるだけ多くの返礼品を検索できる
  • ごちゃごちゃしていない
  • 簡単に検索できる

サイトがほしいと思い、開発に至りました。

といいつつ、まだ網羅できていない返礼品があったり、スマホ版がなかったりと問題がありますが、様子を見て改善していこうと思います。

技術的には、

  • HTML5/CSS3
  • Elasticsearch
  • Let's Encrypt
  • Ubuntu 16.04

といったことをやってみました。

HTML5/CSS3 の勉強には、以下の 2 冊が役に立ちました。ありがとうございます。

最強のCSS設計 チーム開発を成功に導くケーススタディ

最強のCSS設計 チーム開発を成功に導くケーススタディ

Let's Encrypt 関係は、9m さんの記事が大変役に立ちました。ありがとうございます。

どうぞご利用ください。

Kaminari で、最大ページ数を指定する

Kaminari v0.17.0 で確認しました。

ページングされすぎて、サーバに負担がかかる場合などに便利です。


config/initializers/kaminari.rb

Kaminari.configure do |config|
  config.max_pages = 100
end

これで、ページネーション用のリンクなどが 100 ページまでしか表示されなくなります。


page パラメータを手動で設定された場合の対策もしておきます。

app/controllers/application.rb

class ApplicationController < ActionController::Base
  before_action :normalize_page

  private
  def normalize_page
    page = params[:page].to_i
    params[:page] = (page <= 1 || page > Kaminari.config.max_pages) ? nil : page
  end
end

新生銀行に自動ログインする Google Chrome の拡張機能を作りました

以前、新生銀行に自動ログインするユーザースクリプトというものを書いたのですが、Chrome のセキュリティレベルが上がり、動かなくなってしまいました。

そこで今回、拡張機能としてきちんと作りなおしてみました。

Shinsei Power Direct AutoFill - Chrome Web Store

拡張機能の「オプション」でログイン情報を設定することで、自動ログインが可能となります。

ログイン情報は暗号化し、ローカル環境に保存する仕組みです。

ソースコードは GitHub で公開しています。

Chrome 拡張機能の作成には、ドットインストールが大変参考になりました。ありがとうございます。

どうぞご利用ください。

「Elasticsearch: The Definitive Guide」が良い

検索まわりに強くなりたくて、最近は Elasticsearch の勉強をしています。

ただ、ブログの記事や日本語の書籍 (↓) は、情報が古かったり断片的な情報で、いまいち全体像をつかむことができませんでした。

高速スケーラブル検索エンジン ElasticSearch Server

高速スケーラブル検索エンジン ElasticSearch Server

  • 作者: Rafal Kuc・Marek Rogozin’ski,株式会社リクルートテクノロジーズ,大岩達也、大谷純、兼山元太、水戸祐介、守谷純之介
  • 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
  • 発売日: 2014/03/21
  • メディア: 大型本
  • この商品を含むブログ (4件) を見る

そこで、公式サイトにある Elasticsearch: The Definitive Guide を読んでみたところ、わかりやすくてよかったです。

英語なのでちょっとつらいですが、Getting Started まで読むだけでも役立ちそうです。

情報が新しく、Elasticsearch 2.0 に対応しているのも良い点です。


elasticsearch-rails の入門方法

elasticsearch-rails に関しては、サンプルアプリのソースが参考になりました。

WEB+DB PRESS Vol.87 の Elasticsearch 記事も参考になります。

WEB+DB PRESS Vol.87

WEB+DB PRESS Vol.87

  • 作者: 佐藤鉄平,小林明大,石村真吾,坂上卓史,上原誠,鳥居英,佐藤歩,泉水翔吾,うさみけんた,伊藤直也,高橋侑久,佐藤太一,hayajo,橋本翔,西尾泰和,中島聡,はまちや2,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/06/24
  • メディア: 大型本
  • この商品を含むブログ (2件) を見る

elasticsearch:import タスクで eager loading を行う

elasticsearch-rails には、DB のデータを Elasticsearch にインポートするelasticsearch:import という便利な rake タスクがあります。

ただ、has_many などで関連しているデータもインデックスしたい場合に

rake environment elasticsearch:import:all FORCE=y

だけだと、eager loading が行われず、インデックス速度が遅くなってしまいます。

そこで、モデルに

scope :search_import, -> { includes(:categories, :sub_categories) }

のような scope を作ってあげて、

rake environment elasticsearch:import:all SCOPE="search_import" FORCE=y

とすると、eager loading が行われ、インデックス速度を上げることができます。


また、Gemfile に

gem 'ansi'

を追加すると、タスクの実行中にプログレスバーが表示されて便利です。