mmag

ハマったことメモなど

Ectoで生成されるidカラムの名前を変える

Phoenix v0.14.0, mariaex v0.3.2.

発端としては、デフォルトでつくられるidの名前をevent_idにしたかった。というか、事情によりしなければならなかった。table/2primary_key: falseを与えるとidが作られないというのはすぐにわかったのだけれど、auto_incrementをどうやって設定するか、ドキュメントやソースを読んでも見当たらなかったのです。

いろいろ考えていたところ、かなり邪道な方法を思いついたので書いときます。

add

ここでvalidate_type!が呼ばれているのですが、どうやらStringとかのモジュール名で指定しちゃってるばあいに、:stringみたいにアトムで書いてね〜っていうエラーを出しているだけなので、例えば:hogehogeとか、:'varchar(255)'も通るんですね。通ったらどうやらそのままSQLに埋め込まれるっぽいんですね。そこで調子に乗って、:'int(11) auto_increment'とか書くじゃないですか。

create table(:service_event, primary_key: false, engine: "InnoDB") do
  add :event_id, :'int(11) auto_increment', null: false, primary_key: true
  add :title, :'varchar(255)', null: false
  
  # 略
end
mysql> desc app_dev.events;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| event_id | int(11)      | NO   | PRI | NULL    | auto_increment |
| title    | varchar(255) | NO   |     | 0       |                |

 # 略

できちゃってる〜。インジェクションまがい〜。