現時点の最新版であるRails4.2.1以下MySQLデフォルトだと絵文字が保存できません。コンシューマー向けサービスのコメント欄など今どきは普通に絵文字を入力されるのですぐに問題になります。(Incorrect string valueエラーになる)
実直な対応方法はmysqlでutf8ではなくutf8mb4を使うというものです。4byteのunicodeも保存できるようになるので絵文字も問題無しです。絵文字の種類が増えても問題無いでしょう。
ActiveRecordをutf8mb4で動かす - Qiita穏便な解決方法
rails + mysqlデフォで動かないのと、一部のカラムでだけ対応したいこと、全テーブルのインデックスが長くなるとパフォーマンスに影響でそう、mysqlが古いと対応してない、など後ろ向きの理由があって、怖話ではDBに格納するときだけhuman friendlyな文字に変換し、出すときに戻すという実装にしました。
前向きの理由としては、画像への変換と組み合わせて怖話独自の絵文字を追加し易いという点があります。(LINEスタンプ的なのやりたかった)
実装
class Comment
def body=(text)
write_attribute(:body, Rumoji.encode(text))
end
def body
text = read_attribute(:body)
Rumoji.decode(text) if text.present?
end
end
mysql> select body from comments order by id desc limit 1;
+-----------------------------------------+
| body |
+-----------------------------------------+
| テスト:poop::thumbsup::musical_note: |
+-----------------------------------------+
1 row in set (0.00 sec)
rumojiはまさにそのために作られたgemでとっても簡単です。
絵文字共通化問題
非対応プラットフォームでも表示できるよう、画像に変換するというのはまた別のお話・・・。
https://github.com/tanakaworld/rumojinize
modelに一行書くと指定したカラムが自動変換されます。