動かざることバグの如し

近づきたいよ 君の理想に

RailsのModelを動的に生成してDBに接続する方法

環境

やりたいこと

普通、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")

これでいける。割りと黒魔術かも知れないが

参考リンク