Sure. Let me first add that i`m using rails, so i also added 
the https://github.com/TalentBox/sequel-rails gem for backwards 
compatibility with ActiveRecord (i didn't clarify this in the beginning). 
So, as per the gem documentation i changed a couple of things. I made some 
progress on this and maybe the 'problem' has nothing to do with Sequel.

In my config/application.rb i have:

config.sequel.after_connect = proc do
      Sequel::Model.plugin :timestamps, update_on_create: true
      Sequel::Model.plugin :pg_typecast_on_load, :tokens
      Sequel.extension :pg_array
      Sequel.extension :pg_json
end
The docs <https://github.com/TalentBox/sequel-rails#enabling-plugins> suggest 
that this is the right way to do it. I also tried having the plugins and 
extensions loaded in the model, but to no good.

In my app/modes/user.rb i have:

class User < Sequel::Model
  ...
  def generate_auth_token!
    token = SecureRandom.urlsafe_base64(nil, false)
    token_hash = ::BCrypt::Password.create(token)

    self.tokens = Sequel.pg_json({
        token: token_hash,
        expiry: TOKEN_EXPIRY,
        updated_at: Time.now
    })
    save(raise_on_failure: true)
  end

end

In db/migrate i have:

Sequel.migration do
  change do
    create_table(:users) do
      primary_key :id
      ....
      Json :tokens
      ......
    end
  end
end

Given this setup i have a spec:

describe '#generate_auth_token' do
    it 'generates and authentication token' do
      expect(subject.tokens).to be_nil

      subject.generate_auth_token!

      expect(subject.tokens).not_to be_a(String)
      expect(subject.tokens).to have_key(:token) &
                                have_key(:expiry) &
                                have_key(:updated_at)
    end
  end

The funny thing is that this spec is passing. The tokens column is properly 
formatted. *However *when i reload the model the spec fails.(this is how 
everything started, actually, i'm reloading the model in a request spec). 
So if i do this:

describe '#generate_auth_token' do
    it 'generates and authentication token' do
      expect(subject.tokens).to be_nil

      subject.generate_auth_token!
      subject.reload

      expect(subject.tokens).not_to be_a(String)
      expect(subject.tokens).to have_key(:token) &
                                have_key(:expiry) &
                                have_key(:updated_at)
    end
  end

I get: 

Failure/Error: expect(subject.tokens).not_to be_a(String)

       expected 
"{\"token\":\"$2a$10$33MwL5OuPKzhATJgEk.GiOO8T6RIWXnJfc26enzWYv3mqzzhFCRW.\",\"expiry\":\"2016-02-29T12:03:22.821+02:00\",\"updated_at\":\"2016-02-22T12:03:23.072+02:00\"}"
 
not to be a kind of String


For this particular case i don`t need to reload, but in other cases i do. 
In the end probably this has nothing to do with Sequel?

On Sunday, 21 February 2016 22:34:03 UTC+2, Jeremy Evans wrote:
>
> On Sunday, February 21, 2016 at 12:04:57 PM UTC-8, Stefan Slaveykov wrote:
>>
>> I have a type json column in one of my PostgreSQL tables. Following the 
>> docs 
>> <http://sequel.jeremyevans.net/rdoc-plugins/files/lib/sequel/extensions/pg_json_rb.html>
>>  i 
>> added the pg_json extension and also loaded the pg_typecast_on_load plugin 
>> for my model, but i'm always getting a string and not the actual json. The 
>> code looks like this:
>>
>> class User < Sequel::Model
>>   plugin :pg_typecast_on_load, :tokens
>>
>>   def generate_token!
>>     self.tokens = Sequel.pg_json({
>>       token: token_hash,
>>       expiry: TOKEN_EXPIRY,
>>       updated_at: Time.now
>>     })
>>
>>     save(raise_on_failure: true)
>>   end
>> end
>>
>> When i do:
>> user.tokens
>> I get somethink like:
>>
>>
>> "{\"token\":\"$2a$10$ABzWzLDx2C9Q/uLSSoErbO2CxkzKYuzpH0daR/WcD1buPV4QUBK3i\",\"expiry\":\"2016-02-28T21:25:37.789+02:00\",\"updated_at\":\"2016-02-21T21:25:38.138+02:00\"}"
>>
>>
>> I`m pretty new to Sequel( i find it really fun and easy to work with) and 
>> maybe i missed something along the way, but i just don`t know what exactly. 
>> I tried using strings, instead of symbols for keys, removing the 
>> pg_typecase_on_load plugin, but nothing helped. What am i doing wrong? 
>> Should be something pretty straightforward.
>>
>
> Assuming you did DB.extension :pg_json before creating the model class, 
> things should just work and you should not need to use the 
> pg_typecast_on_load plugin.  Based on your description, I'm not sure why 
> you are having the problem. The only thing I can think of would be using 
> Sequel.extension :pg_json instead of DB.extension :pg_json, but considering 
> you linked to the correct documentation and the documentation shows 
> DB.extension :pg_json, that seems unlikely.
>
> Can you post a self contained example showing the problem?
>
> Thanks,
> Jeremy
>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to