hanami / model

Ruby persistence framework with entities and repositories

Home Page:http://hanamirb.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Weird jsonb insertion behaviour

7even opened this issue · comments

Hi.

I encountered a really strange bug trying to create a parent object along with it's children (associated via has_many): it seems like hanami/model (or maybe ROM) doesn't recognize that the table column type is jsonb and sends it to Sequel without wrapping in Sequel.pg_json (just a guess).

Furthermore, this only happens when the child table doesn't have timestamp columns; if I add created_at and updated_at columns to the table everything behaves as it should.

I reproduced the problem in my fork of bookshelf application; here's the method that handles the creation and here's the error (books.info is a jsonb column):

irb(main):001:0> AuthorRepository.new.create_with_books(first_name: 'John', last_name: 'Smith', books: [{ title: 'Some book', info: { released_in: 1997 } }])
[bookshelf] [INFO] [2017-10-06 01:09:36 +0300] (0.000325s) SELECT "id", "title", "author_id", "info" FROM "books" LIMIT 1
[bookshelf] [INFO] [2017-10-06 01:09:36 +0300] (0.000190s) SELECT "id", "first_name", "last_name" FROM "authors" LIMIT 1
[bookshelf] [INFO] [2017-10-06 01:09:36 +0300] (0.001262s) INSERT INTO "authors" ("first_name", "last_name") VALUES ('John', 'Smith') RETURNING *
[bookshelf] [ERROR] [2017-10-06 01:09:36 +0300] PG::UndefinedColumn: ERROR:  column "released_in" does not exist
LINE 1: ...itle", "info", "author_id") VALUES ('Some book', ("released_...
                                                             ^: INSERT INTO "books" ("title", "info", "author_id") VALUES ('Some book', ("released_in" = 1997), 7) RETURNING *
Hanami::Model::DatabaseError: PG::UndefinedColumn: ERROR:  column "released_in" does not exist
LINE 1: ...itle", "info", "author_id") VALUES ('Some book', ("released_...
                                                             ^

	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/hanami-model-1.1.0.beta3/lib/hanami/model/associations/has_many.rb:55:in `rescue in create'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/hanami-model-1.1.0.beta3/lib/hanami/model/associations/has_many.rb:52:in `create'
	from /Users/7even/projects/bookshelf/lib/bookshelf/repositories/author_repository.rb:15:in `create_with_books'
	from (irb):1
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/hanami-1.1.0.beta3/lib/hanami/cli/commands/console.rb:51:in `call'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/hanami-1.1.0.beta3/lib/hanami/cli/commands/command.rb:85:in `call'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/hanami-cli-0.1.0.beta3/lib/hanami/cli.rb:54:in `call'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/hanami-1.1.0.beta3/bin/hanami:6:in `<top (required)>'
	from /Users/7even/.rbenv/versions/2.4.2/bin/hanami:23:in `load'
	from /Users/7even/.rbenv/versions/2.4.2/bin/hanami:23:in `<top (required)>'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/cli/exec.rb:74:in `load'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/cli/exec.rb:74:in `kernel_load'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/cli/exec.rb:27:in `run'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/cli.rb:362:in `exec'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/vendor/thor/lib/thor.rb:387:in `dispatch'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/cli.rb:22:in `dispatch'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/vendor/thor/lib/thor/base.rb:466:in `start'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/cli.rb:13:in `start'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/exe/bundle:30:in `block in <top (required)>'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/lib/bundler/friendly_errors.rb:121:in `with_friendly_errors'
	from /Users/7even/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.15.4/exe/bundle:22:in `<top (required)>'
	from /Users/7even/.rbenv/versions/2.4.2/bin/bundle:23:in `load'
	from /Users/7even/.rbenv/versions/2.4.2/bin/bundle:23:in `<main>'

Hi @7even we'll take a look and update you with more info when found the problem. Thanks!