Confusion of acts_as_versioned and inheritance?

I'm having some problems with acts_as_versioned. All my foo_versions have the same version id. Description by example:

ruby script/console

Loading development environment.

p = Product.find_by_id 1

[...]

p.versions.size

=> 6

p.versions.each { |version|

?> puts version.id

}

1 2 3 4 5 6 [...]

p.find_version 1

=> #<Item::Version:0x8ed788c @attributes={"item_id"=>"1", "name"=>"", "visible"=>"1", "brand_id"=>"1", "updated_at"=>"2006-11-24 16:34:01", "code"=>"", "title"=>"", "versioned_type"=>"Product", "creator_id"=>"1", "id"=>"1", "version"=>"1", "heading"=>"", "description"=>"", "updater_id"=>"1", "created_at"=>"2006-11-24 16:34:01"}> [some content removed]

p.find_version 2

=> nil

p.find_version 3

=> nil

p.find_version 4

=> nil

p.find_version 5

=> nil

p.find_version 6

=> nil

Looking at the Database:

select version from item_versions;

1 1 1 1 1 1

Is this because I'm using inheritance?

The structure is:

Element (editable, versionable, etc)    > Item (purchaseable)        > Product (single item, no special discounts, etc)

I've tried to move as much of the logic for each layer to the bottom of the heap. Thus my Element class looks like this:

cat app/models/element.rb

class Element < ActiveRecord::Base   public     self.abstract_class = true

    has_one :creator, :class_name => 'Editor', :foreign_key => :id     has_one :updater, :class_name => 'Editor', :foreign_key => :id

    validates_presence_of :created_at, :on => :update     validates_presence_of :updated_at, :on => :update     validates_inclusion_of :visible, :in => 0..1 end

How can I nail down the issue? My guess is that acts_as_versioned is thinking I'm always making a version 1 as it is looking at Item or Product where it shouldn't be. Any help or criticisms of the approach I have taken above appreciated. This is mostly a proof of concept for a possible piece of further development at the moment.

Thanks! Dominic

djwmarks wrote:

How can I nail down the issue? My guess is that acts_as_versioned is thinking I'm always making a version 1 as it is looking at Item or Product where it shouldn't be. Any help or criticisms of the approach I have taken above appreciated. This is mostly a proof of concept for a possible piece of further development at the moment.

Are you using optimistic locking in your tables? acts_as_versioned will use the version_lock field as the version number instead of the "version" field if it exists. If that is the case then "version" becomes just a normal field and does not automatically increment.

Eric

I see. I am indeed using optimistic locking. I think I may be making a problem for my self as although I have inheritance in place I am not using STI.

The Product class sets its table to products, there is no items table in the database. However I do have item_versions table, and it sets the versioned_type attribute correctly to Product.

I'm constructing the versioned_table with a migration and the create_versioned_table method.

I'm going to play around a little more and see if I can get a little further myself. Is there a way of getting the the queries being sent to SQLite in ruby script/console or script/server? That would be a big help.

Thanks! Dominic

Dominic Marks wrote:

I'm going to play around a little more and see if I can get a little further myself. Is there a way of getting the the queries being sent to SQLite in ruby script/console or script/server? That would be a big help.

The log files should have them.