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.