This page looks best with JavaScript enabled

rom-rbでcustom mapperを使っている時に must be a subclass of ROM::Struct が出る時の対処法

 ·  ☕ 1 min read

現象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
require 'rom/transformer'

class UserMapper < ROM::Transformer
  relation :users, as: :default

  map_array do
    symbolize_keys
    constructor_inject Entities::User
  end
end

class UserRepository < ROM::Repository[:users]
  struct_namespace Entities
end

のようなcustom mapperを定義し、

1
user_repository.users.map_with(:default).to_a

とした時に以下のようなエラーが出る

1
Dry::Core::ClassBuilder::ParentClassMismatch: User must be a subclass of ROM::Struct

これはauto_structを使用している時のエラーにみえるが、意図としてはcustom mapperを使っているのだからROM::Structのサブクラスである必要はないはず

原因

仕様かどうかはわからないが、 struct_namespacemap_with を同時に使用すると発生するよう

対処法

1
2
3
class UserRepository < ROM::Repository[:users]
  # struct_namespace Entities # これを消す
end
Share on

ippachi
WRITTEN BY
ippachi
Software Developer