New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support UUID Model ids #145

Closed
KelseyDH opened this Issue Feb 22, 2018 · 2 comments

Comments

Projects
None yet
3 participants
@KelseyDH
Contributor

KelseyDH commented Feb 22, 2018

UUID's are a popular strategy for model id's due to their unique properties across all tables. Unfortunately it appears that this gem does not support uuid's natively, owing to a 17 strong character letter limit on scope objects id.

This can be seen with the following test, which will fail:

    it 'finds account by uuid' do
      object_with_uuid = double(:id => 'fea45df8-2ec0-4e8d-9c5a-5871a5414bca')

      expect do
        DoubleEntry.account(:savings, :scope => object_with_uuid)
      end.to_not raise_error

      expect do
        DoubleEntry.balance(:savings, :scope => object_with_uuid)
      end.to_not raise_error
    end

Which if run will result in this failure showing the problem:

=>      Failure/Error:
       expect do
         DoubleEntry.account(:savings, :scope => object_with_uuid)
       end.to_not raise_error
     
       expected no Exception, got #<DoubleEntry::ScopeIdentifierTooLongError: scope identifier 'fea45df8-2ec0-4e8d-9c5a-5871a5414bca' is too long. Please limit it to 23 characters.> 

with backtrace:
         # ./lib/double_entry/account.rb:167:in `ensure_scope_is_valid'
         # ./lib/double_entry/account.rb:108:in `initialize'
         # ./lib/double_entry/account.rb:27:in `new'
         # ./lib/double_entry/account.rb:27:in `account'
         # ./lib/double_entry.rb:44:in `account'
         # ./spec/double_entry_spec.rb:417:in `block (4 levels) in <top (required)>'
         # ./spec/double_entry_spec.rb:416:in `block (3 levels) in <top (required)>'
     # ./spec/double_entry_spec.rb:416:in `block (3 levels) in <top (required)>'

Instead, double_entry implemention should support both sequential ids and uuid's -- the big benefit with UUID's being we no longer need to worry about the validity of id values and what model its associated with. This makes it easy to use double_entry in outside contexts, like consuming the ledgers of external systems where account objects are represented as api keys or other arbitrary string values.

@swrobel

This comment has been minimized.

Show comment
Hide comment
@swrobel

swrobel Mar 1, 2018

Contributor

A search would've revealed this has been discussed before: #100

Contributor

swrobel commented Mar 1, 2018

A search would've revealed this has been discussed before: #100

@orien

This comment has been minimized.

Show comment
Hide comment
@orien

orien May 20, 2018

Member

Yes, one can customise the database column constraints. Both the length of strings and the size of integers. Although I understand the reluctance to deviate from what's provided by default.

Perhaps we should move the default to be most accomodating: 255 character strings and 64 bit integers. Applications can then choose to impose a stricter constraint if they so choose.

Member

orien commented May 20, 2018

Yes, one can customise the database column constraints. Both the length of strings and the size of integers. Although I understand the reluctance to deviate from what's provided by default.

Perhaps we should move the default to be most accomodating: 255 character strings and 64 bit integers. Applications can then choose to impose a stricter constraint if they so choose.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment