Hanamiを使っているとRepositoryが自動で設定してくれるテーブル名を変更したい時があります。
対応
class HogeRepository < Hanami::Repository
self.relation = :t_hoges
end
HogeRepository.new.t_hoges.where(id: 1)
# => [sample] [INFO] [2018-07-23 22:56:27 +0900] (0.000640s) SELECT `id` FROM `t_hoges` WHERE (`id` = 1) ORDER BY `t_hoges`.`id`
Hanami::Repository.relation
を上書きすることで対応可能です。
私の場合
Hanami::Repository
が推測してくれるテーブル名はHanami::Utils::String.pluralize
というメソッドによって実装されているのですが、こいつが時たま「マジかっ」って変換をします。
irb(main):003:0> Hanami::Utils::String.pluralize('fee')
=> "fees"
irb(main):004:0> Hanami::Utils::String.pluralize('original_fee')
=> "original_ves"
こういうやつ。
このままだと
FeeRepository
はfeesテーブルを参照するのに、
OriginalFeeRepository
はoriginal_vesテーブルを参照してしまいますね。
feeに接頭語をつけると複数形が変化してしまうんですね。
言語的に何が正しいのかまでは分からないのですが、
私の場合は、接頭語がつく時とつかない時も同じようにfeesを参照して欲しかったので、
Hanami::Repository.relation
を上書きすることで無事に対応できましたとさ。
リスク
Hanami::Repository.relation
を上書きする
という対応はHanamiの公式ドキュメントには載っていない方法です。
hanami/repository.rb#L281らへんにできる風なコメントは書いてありますが、後々変更されるリスクはあると思います。
こういったリスクを取りたくない場合は、素直にHanamiが設定するテーブル名にすることがよいかと思われます。
モデルの名前を変更するのも一案ですね。
マサカリ歓迎です。コメントください!
以上。