環境
- Rails 5.1
やりたいこと
普通、RailsのModelはapp/model以下に予め記述するが、特殊な例で動的に生成させたい場合
最初はメタプログラミングでいけるやろって思ったけど、
> mymodel = Class.new(ApplicationRecord) => #<Class:0x007f8e422a3668> (call '#<Class:0x007f8e422a3668>.connection' to establish a connection) > mymodel.establish_connection(dbconfig) RuntimeError: Anonymous class is not allowed.
は??????
どうもActiverecordのソースを読むと
raise RuntimeError, "Anonymous class is not allowed." unless owner.name
となっていて無名クラスの場合は無理っぽい。なんでやねん
結果
const_setとconst_getを駆使する
Object.const_set("MyModel#{id}", Class.new(ApplicationRecord)) dbconfig = ...(略) Object.const_get("MyModel#{id}").establish_connection(dbconfig) Object.const_get("MyModel#{id}").where(name: "taro")
これでいける。割りと黒魔術かも知れないが