LoginSignup
1
0

More than 5 years have passed since last update.

Wikiをつくる(Optionテーブルの設計について)

Posted at

Wikiをつくる(ユーザーの招待機能について) - Qiitaの続き

欲しかったもの

サイトのタイトル、説明や何かのフラグなどを簡単に保存しておく方法が欲しかった。
やれることとしては「config」というgemが近いのだけど、これはYAMLにデータを保存する形式。変更しないデータについては便利なのだけど、アプリ利用者が更新するには向いていない。

使い方としてはOption.site_titleで参照できて、Option.site_title = "hoge"などで保存できるようなものがよい。

作ったもの

このようなTableはWordpressを参考にさせてもらい下記のようなものを用意した。keyvalueはMySQLの予約後なのでoptionというプリフィックスをつけた。

  create_table "options", force: :cascade do |t|
    t.string   "option_key",   default: "", null: false
    t.text     "option_value", default: "", null: false
    t.datetime "created_at",                null: false
    t.datetime "updated_at",                null: false
  end

そして、モデルをこのようにした。method_missingで拾う方式だ。
lokka/option.rb at master · lokka/lokkaでやっているのを参考にRailsで置き換えた。

class Option < ApplicationRecord
  def self.method_missing(method, *args)
    attribute = method.to_s
    if attribute =~ /=$/
      column = attribute[0, attribute.size - 1]
      o = self.find_or_initialize_by(option_key: column)
      o.option_value = args.first.to_s
      o.save
    else
      o = self.find_or_initialize_by(option_key: method.to_s)
      o.option_value
    end
  end
end

何か弊害がないか心配だった心配だったが特に問題なさそうなのでこのようにした。

次のように意図通り動くようになった

[16] pry(main)> Option.foo 
=> ""
[17] pry(main)> Option.foo = 'bar'  #代入してみる
=> "bar" 
[18] pry(main)> Option.foo  #参照できるようになった
=> "bar"
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0