質問編集履歴

2 fix typo

iyuuya

iyuuya score 19

2017/01/06 12:55  投稿

STORED GENEARATEDカラムがNULLになる
###環境
- MySQL 5.7
- Ruby 2.3.3
- Rails 5.0.1
- Rspec / FactoryGirl / DatabaseRewinder
###前提・実現したいこと
掲示板のような機能で全文検索を実装しようとしています。
テストを走らせるとSTORED GENERATEDカラムがNULLになっていて困っています。
Topicモデルに`title`と`descritpion`を持たせており、この二つをCONCATしたカラム(`fulltext_column`とします)を検索対象としています。
##### migration
`fulltext_column`を追加するmigrationです。
```ruby
class AddFulltextColumnToTopics < ActiveRecord::Migration[5.0]
 def up
   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"
 end
 def down
   remove_column :topics, :fulltext_column
 end
end
```
なお、ngram_token_sizeは2に設定してあります。
##### Topicモデル
実際のコードとは少し異なりますがMATCH AGAINSTで検索します。
```ruby
class Topic < ApplicationRecord
 scope :search_words, ->(words) do
   where('MATCH(fulltext_column) AGAINST (? IN BOOLEAN MODE)', words)
 end
end
```
##### テストコード
```ruby
RSpec.describe Topic, type: :model do
 describe '.search_words(words)' do
   subject { Topic.search_words(words).count }
   let(:words) { 'ほげ ふが' }
   before do
     FactoryGirl.create :topic, title: 'ほげ', description: 'ふが'
   end
   it { is_expected.to eq 1 }
 end
end
```
###発生している問題・エラーメッセージ
「ほげ」にも「ふが」にもマッチせず結果は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_column`は`nil`でした。
rails console, FactoryGirlでデータを投入した場合は`fulltext_column`にデータが格納されることは確認できました。
rspecで場合のみ`fulltext_column`がCONCATで生成されていないような感触です。
rspecの場合のみ`fulltext_column`がCONCATで生成されていないような感触です。
---
知見のある方、御教授をお願いします。
  • MySQL

    10207 questions

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

  • Ruby on Rails

    15896 questions

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

  • RSpec

    510 questions

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

1 ngram_token_sizeについて記載

iyuuya

iyuuya score 19

2017/01/06 12:51  投稿

STORED GENEARATEDカラムがNULLになる
###環境
- MySQL 5.7
- Ruby 2.3.3
- Rails 5.0.1
- Rspec / FactoryGirl / DatabaseRewinder
###前提・実現したいこと
掲示板のような機能で全文検索を実装しようとしています。
テストを走らせるとSTORED GENERATEDカラムがNULLになっていて困っています。
Topicモデルに`title`と`descritpion`を持たせており、この二つをCONCATしたカラム(`fulltext_column`とします)を検索対象としています。
##### migration
`fulltext_column`を追加するmigrationです。
```ruby
class AddFulltextColumnToTopics < ActiveRecord::Migration[5.0]
 def up
   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"
 end
 def down
   remove_column :topics, :fulltext_column
 end
end
```
 
なお、ngram_token_sizeは2に設定してあります。  
##### Topicモデル
実際のコードとは少し異なりますがMATCH AGAINSTで検索します。
```ruby
class Topic < ApplicationRecord
 scope :search_words, ->(words) do
   where('MATCH(fulltext_column) AGAINST (? IN BOOLEAN MODE)', words)
 end
end
```
##### テストコード
```ruby
RSpec.describe Topic, type: :model do
 describe '.search_words(words)' do
   subject { Topic.search_words(words).count }
   let(:words) { 'ほげ ふが' }
   before do
     FactoryGirl.create :topic, title: 'ほげ', description: 'ふが'
   end
   it { is_expected.to eq 1 }
 end
end
```
###発生している問題・エラーメッセージ
「ほげ」にも「ふが」にもマッチせず結果は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_column`は`nil`でした。
rails console, FactoryGirlでデータを投入した場合は`fulltext_column`にデータが格納されることは確認できました。
rspecで場合のみ`fulltext_column`がCONCATで生成されていないような感触です。
---
知見のある方、御教授をお願いします。
  • MySQL

    10207 questions

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

  • Ruby on Rails

    15896 questions

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

  • RSpec

    510 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る