ActiveRecordをreadonlyで動かす

2020/1/10追記
こっちをおすすめします!
https://hai3.net/blog/sandbox-rails-console/


ActiveRecordは、ActiveRecord::Base#readonly?というメソッドがtrueを返すと、updateやdestroyができなくなる。

例えば「本番環境でデータ検索したいけど、うっかりデータベース書き換えるのが怖い・・・!」
ということならば、このメソッドが常にtrueを返すようにしてしまうと気が楽、、、かも。。

class ActiveRecord::Base
  def readonly?
    true # 強制的にtrueを返すぜ
  end
end

でもこれだけだと不十分で、update_columnやupdate_columnsなどのreadonly?を呼ばずにデータを更新するメソッドには意味が無い。
これらupdate_columnやupdate_columnsは、カラムごとのreadonly属性(attr_readonlyで設定されたもの)はチェックするので、下のように全部のカラムをreadonlyとして扱うにしてしまうとupdate_columnも無効化できる。

class ActiveRecord::Base
  def readonly?
    true
  end

  def self.readonly_attributes
    attribute_names
  end
end

これでreadonlyに操作ができるようになった。
でも、コアな部分を書き換えるので、それはそれで怖いな!

これで問題が起きても責任は取れません!

タイトルとURLをコピーしました