質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1764閲覧

STORED GENEARATEDカラムがNULLになる

iyuuya

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/01/06 03:41

編集2017/01/06 03:55

###環境

  • MySQL 5.7
  • Ruby 2.3.3
  • Rails 5.0.1
  • Rspec / FactoryGirl / DatabaseRewinder

###前提・実現したいこと

掲示板のような機能で全文検索を実装しようとしています。
テストを走らせるとSTORED GENERATEDカラムがNULLになっていて困っています。

Topicモデルにtitledescritpionを持たせており、この二つをCONCATしたカラム(fulltext_columnとします)を検索対象としています。

migration

fulltext_columnを追加するmigrationです。

ruby

1class AddFulltextColumnToTopics < ActiveRecord::Migration[5.0] 2 def up 3 execute "ALTER TABLE topics ADD fulltext_column TEXT AS (CONCAT_WS(' ', title, description)) STORED COMMENT '検索用カラム' AFTER description, ADD FULLTEXT KEY (fulltext_column) WITH PARSER ngram" 4 end 5 6 def down 7 remove_column :topics, :fulltext_column 8 end 9end

なお、ngram_token_sizeは2に設定してあります。

Topicモデル

実際のコードとは少し異なりますがMATCH AGAINSTで検索します。

ruby

1class Topic < ApplicationRecord 2 scope :search_words, ->(words) do 3 where('MATCH(fulltext_column) AGAINST (? IN BOOLEAN MODE)', words) 4 end 5end
テストコード

ruby

1RSpec.describe Topic, type: :model do 2 describe '.search_words(words)' do 3 subject { Topic.search_words(words).count } 4 let(:words) { 'ほげ ふが' } 5 6 before do 7 FactoryGirl.create :topic, title: 'ほげ', description: 'ふが' 8 end 9 10 it { is_expected.to eq 1 } 11 end 12end

###発生している問題・エラーメッセージ

「ほげ」にも「ふが」にもマッチせず結果は0件となってしまっています。

1) Topic.search_words(words) should eq 1 Failure/Error: it { is_expected.to eq 1 } expected: 1 got: 0 (compared using ==)

###試したこと
DatabaseRewinderのstrategyを:truncationに設定してみたが解決できなかった。

before内のFactoryGirl.create後にbinding.pryで値を確認してみたところ、
fulltext_columnnilでした。

rails console, FactoryGirlでデータを投入した場合はfulltext_columnにデータが格納されることは確認できました。
rspecの場合のみfulltext_columnがCONCATで生成されていないような感触です。


知見のある方、御教授をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

RAILS_ENV=test bin/rails db:reset
していた為でした。
db/schema.rbには記事に記載したmigrationが反映されていませんでした。

RAILS_ENV=test bin/rails db:migrate:reset
すれば問題なく動きました。

投稿2017/01/06 05:30

編集2017/01/06 05:31
iyuuya

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問