はじめまして、ruby on rails初めて1ヶ月と1日がたちました。
現在制作している掲示板もなんとか形になってきました。
今回は投稿されたテキスト内にDBに保存されているキーワードがあった場合、キーワードとしてリンク化(いわゆるタグ化)する実装の流れについてご教授いただきたいです。
いま、想定される問題は以下です。
・参照するDB内のキーワードの量が200を越すことが想定されます。リンクを生成し投稿完了画面への遷移時に遅延が発生しないか。
また、現在想定している実装の流れは以下です。
・参照用のDBの作成
・投稿テキストにDBのキーワードを総当て(ここの実装が難しいです)
・重複キーワードをviewにリンクタグとして表示する
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/26 00:43
2017/01/26 00:43
2017/01/26 01:44
2017/01/26 01:45
2017/01/26 01:58
2017/01/26 02:01
2017/01/26 02:02
2017/01/26 02:04
2017/01/26 02:05
2017/01/26 02:09
2017/01/26 02:12
2017/01/26 02:16
2017/01/26 02:17
2017/01/26 02:20
2017/01/26 02:24
2017/01/26 02:26
2017/01/26 02:30
2017/01/26 02:31
2017/01/26 02:34
2017/01/26 02:38
2017/01/26 02:45
回答1件
0
gem 'acts-as-taggable-on'
gem 'natto'
をgemfileに追加
bundle install
rake acts_as_taggable_on_engine:install:migrations
rake db::migrateを実行
Postモデルに
acts_as_taggable
を追加
Postモデルと
ruby
1acts_as_taggable 2before_save :standarize_text,:save_tags 3def standarize_text 4end 5def save_tags 6array=check_taggable_word(self.title) 7self.tag_list.add(array) 8end 9def check_taggable_word(text) 10ary=Array.new 11 nm = Natto::MeCab.new 12 nm.parse(text) do |n| 13 ary<<n.surface 14 end //mekabuで要素に分解 15tags=ActsAsTaggableOn::Tag.pluck(:name)//タグを取得 16return ary & tags //共通部分を返す 17end
Commentモデルに
ruby
1before_save :standarize_text,:save_tags 2def standarize_text 3重複や入力ブレを治すため文字を大文字とかに直す半角カナも直す、nkfとか使って見てください 4end 5def save_tags 6array=check_taggable_word(self.comment) 7self.post.tag_list.add(array) 8end 9def check_taggable_word(text) 10ary=Array.new 11 nm = Natto::MeCab.new 12 nm.parse(text) do |n| 13 ary<<n.surface 14 end //mekabuで要素に分解 15tags=ActsAsTaggableOn::Tag.pluck(:name)//タグを取得 16return ary & tags //共通部分を返す 17end
こんな感じですかね
mekabuライブラリで文章を単語に分解して作ったarrayと
tagに登録されている全ての単語のtagsの共通部分を取っています
あと新たなtagが追加されるたびに全てのコメントにそのタグがないかチェックして
追加する機能が必要です。
パッチを追加してact_as_taggle_onのtag classを拡張して見てください
ruby
1module ActAsTaggleOnPatch 2module TagPatch 3 def self.included(base) 4 base.extend(ClassMethods) 5 base.send(:include, InstanceMethods) 6 base.class_eval do 7 after_commit :set_this_tag_for_post 8 end 9 end 10 module ClassMethods 11 end 12 13 module InstanceMethods 14 def set_this_tag_for_post 15 regexp=Regexp.new(self.name) 16 Post.all.each do |post| 17 18 tag=post.comment.match(regexp) 19 if tag 20 post.tag_list.add(self.name) 21 post.comments.each do |comment| 22 c=comment.comment.match(regexp) 23 if c 24 post.tag_list.add(self.name) 25 brake 26 end 27 end 28 29end 30 31end 32end
もちろんinitializer.rbに
ruby
1ActsAsTaggableOn::Tag.send(:include,ActsAsTaggableOnPatch::TagPatch)
を入れてください
投稿2017/01/26 03:35
編集2017/02/06 09:44総合スコア2241
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/26 03:40
2017/02/06 00:07
2017/02/06 00:42 編集
2017/02/06 00:37
2017/02/06 00:45
2017/02/06 00:52
2017/02/06 01:07
2017/02/06 01:11
2017/02/06 01:21 編集
2017/02/06 02:02
2017/02/06 02:43
2017/02/06 03:27 編集
2017/02/06 04:25
2017/02/06 05:28
2017/02/06 05:38
2017/02/06 05:57 編集
2017/02/06 06:01
2017/02/06 07:12 編集
2017/02/06 07:43
2017/02/06 08:00
2017/02/06 08:22
2017/02/06 08:34
2017/02/06 08:42
2017/02/06 08:45
2017/02/06 08:46
2017/02/06 09:01
2017/02/06 09:46
2017/02/06 10:11
2017/02/06 19:07 編集
2017/02/06 19:13
2017/02/06 19:35
2017/02/07 00:19
2017/02/08 02:06 編集
2017/02/09 22:59
2017/02/09 23:44
2017/02/10 00:05
2017/02/10 00:20
2017/02/10 00:34
2017/02/10 00:37
2017/02/19 23:24 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。