Oh never mind: the issue is having a column named "model," no problem once that 
is renamed.

Thanks!
Andrew

> On May 4, 2015, at 10:45 AM, Andrew Burleson <[email protected]> wrote:
> 
> Thanks Jeremy. I looked at something like that initially. It felt odd so I 
> thought I'd check in for some other ideas, but I think the approach makes 
> sense now that I've had time to get used to it :)
> 
> 
> Meanwhile, I'm running into a new issue with associations changing in the 
> after_save hook.
> 
> I started with code that looked like this:
> 
> I have a class Job with versions associated like so:
> 
> Job.one_to_many :versions, :class => 'JobVersion', :order => :created_at
> 
> And the after_save hook is like this:
>     def after_save
>       super
>       version = JobVersion.new
> 
>       version.set @_version_meta.to_h if @_version_meta
>       version.model = to_hash.except(:id,:created_at,:updated_at)
>       version.diff = Hash.diff(version.model,versions.last.model) if 
> versions.last
>       add_version(version)
>       @version_meta = nil
>     end
> 
> Here the `JobVersion` columns `model` and `diff` are jsonb hashes. However I 
> get the following:
> 
> Sequel::Error:         Sequel::Error: can't express #<JobVersion 
> @values={:id=>134, :job_id=>15174, :user_id=>nil, :created_at=>2015-05-04 
> 10:37:46 -0400, :customer_note=>nil, :internal_note=>nil, :diff=>nil, 
> :model=>{"state"=>"assigned", "credit"=>0.0, "net_price"=>50.0, 
> "vendor_ap"=>42.5, "gross_price"=>50.0, "transaction_fee"=>1.75}}> as a SQL 
> literal
> 
> I'm wondering if the jsonb columns are throwing this off? If I reconstruct 
> the method like so:
> 
>     def after_save
>       super
>       version = JobVersion.new
>       version.set @_version_meta.to_h if @_version_meta
>       version.job_id = id
>       version.model = to_hash.except(:id,:created_at,:updated_at)
>       version.diff = Hash.diff(version.model,versions.last.model) if 
> versions.last
>       version.save
>       @version_meta = nil
>     end
> 
> Then it works, but the model has to be reloaded for the model.versions to be 
> up to date.
> 
> Is there a way to tell the model to just reload the associations? Or do you 
> know why the `add_version` call is failing?
> 
> Thanks!
> Andrew
> 
> 
>> On Sunday, May 3, 2015 at 6:02:58 PM UTC-4, Andrew Burleson wrote:
>> I'm working on doing some versioning on a sequel model. It's simple enough 
>> to do something like: `Model.one_to_many :versions` and then use an 
>> `after_save` hook to create a version which serializes the state of the 
>> model.
>> 
>> However, I'm interested in adding some optional field on the version table, 
>> like user (who made the changes) and notes (why the changes were made). I'd 
>> love to create a simple syntax for accessing these fields that exist on the 
>> version table and not the original model, something like:
>> 
>> a_model.update({name: "foo", amount: 123}) do |version|
>>   version.user = current_user
>>   version.note = "Updated model amount for some reason"
>> end
>> 
>> In the example above the idea is the model version will be created 
>> regardless, but if a block is given the not yet saved version is yielded to 
>> the block so the caller can access it (to add change notes etc).
>> 
>> I've been able to make something like this work by overriding `save` and 
>> `update`, but it's not dry, and it doesn't seem like this would cover all 
>> the ways you can save a model (e.g. `update_all`). Meanwhile doing this via 
>> a hook doesn't seem viable as I see no way to forward the optional block 
>> from the various save-triggering methods.
>> 
>> Any suggestions? Is there a standardized or better approach to implementing 
>> versioning using sequel?
>> 
>> Thanks!
>> Andrew
> 
> -- 
> You received this message because you are subscribed to a topic in the Google 
> Groups "sequel-talk" group.
> To unsubscribe from this topic, visit 
> https://groups.google.com/d/topic/sequel-talk/RTn6U6fnMwA/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to 
> [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sequel-talk.
> For more options, visit https://groups.google.com/d/optout.

-- 
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 http://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to