Hi!

I'm trying to use the PGArray extension, but the Ruby arrays are returned as 
strings, instead of Array instances. I'm using versions:

$ bundle show | grep -E "sequel|pg"
  * pg (0.14.1)
  * sequel (3.41.0)
  * sequel_pg (1.6.1)

My setup code is (within a Padrino app):

Sequel::Model.plugin(:schema)
Sequel::Model.raise_on_save_failure = false # Do not throw exceptions on failure
Sequel::Model.db = Sequel.connect((ENV["PORTAL_DATABASE_URL"] || 
"postgres://localhost/portal_#{Padrino.env}").sub("jdbc:postgresql", 
"postgres"), :loggers => [Padrino.logger])

require "sequel/extensions/pg_array"
Sequel::Model.db.extend Sequel::Postgres::PGArray::DatabaseMethods

Then I ask for active users with their permissions and associated accounts:

user0 = User.naked.
  select(:users__email, :users__name, :users__default_ui_language, :users__id, 
:users__user_id, :array_agg.sql_function(:domain).as(:domains), 
:array_agg.sql_function(:permission).as(:products)).
  inner_join(:user_accounts, [:email]).
  inner_join(:account_product_permissions, [:domain]).
  filter(users__id: authenticated_user_id, users__user_state: "active").
  group(:users__email, :users__name, :users__default_ui_language, :users__id, 
:users__user_id).
  first

user1 = User.
  select(:users__email, :users__name, :users__default_ui_language, :users__id, 
:users__user_id, :array_agg.sql_function(:domain).as(:domains), 
:array_agg.sql_function(:permission).as(:products)).
  inner_join(:user_accounts, [:email]).
  inner_join(:account_product_permissions, [:domain]).
  filter(users__id: authenticated_user_id, users__user_state: "active").
  group(:users__email, :users__name, :users__default_ui_language, :users__id, 
:users__user_id).
  first

I'm running the query twice to see if there are differences with the #naked 
call, while debugging. The generated query is (identical between both cases, as 
expected):

SELECT
    "users"."email"
  , "users"."name"
  , "users"."default_ui_language"
  , "users"."id", "users"."user_id"
  , array_agg("domain") AS "domains"
  , array_agg("permission") AS "products"
FROM "users"
  INNER JOIN "user_accounts" USING ("email")
  INNER JOIN "account_product_permissions" USING ("domain")
WHERE (("users"."id" = 2) AND ("users"."user_state" = 'active'))
GROUP BY "users"."email", "users"."name", "users"."default_ui_language", 
"users"."id", "users"."user_id"
LIMIT 1

which is, as far as I'm concerned, exactly what I want. Running the above query 
in psql returns correct values in domains and products, namely text::[] values. 
 Unfortunately, the resulting hash has unparsed values:

(rdb:1) pp user0
{:email=>"[email protected]",
 :name=>"Customer",
 :default_ui_language=>"fr",
 :id=>2,
 :user_id=>"aee3a8ff-6961-4700-87e5-d5eb0546c0ac",
 :domains=>"{yourdomain,yourdomain}",
 :products=>"{dashboard,\"weekly report\"}"}

(rdb:1) pp user1
#<User @values={:email=>"[email protected]", :name=>"Customer", 
:default_ui_language=>"fr", :id=>2, 
:user_id=>"aee3a8ff-6961-4700-87e5-d5eb0546c0ac", 
:domains=>"{yourdomain,yourdomain}", :products=>"{dashboard,\"weekly 
report\"}"}>

I expected user0.fetch(:products) to return the Ruby value ["dashboard", 
"weekly report"].

Did I forget to load an extension? According to 3.34's[1] release notes, I only 
need to load the PGArray extension.

Thanks!
François

  [1]: http://sequel.rubyforge.org/rdoc/files/doc/release_notes/3_34_0_txt.html

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en.

Reply via email to