Skip to content
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

Enables infinite precision on Money attributes based on column type #1

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

marcusmateus
Copy link
Collaborator

@marcusmateus marcusmateus commented Aug 15, 2019

Uses work on money gem (ShippingEasy/money#2) and the monetize gem (ShippingEasy/monetize#1) to add infinite_precision support at the instance level. Leveraging that work these changes set the precision on the Money instance for a model attribute based on that attributes backing column type. If it is backed by a :decimal column an infinite precision Money instance is created. Otherwise a normal precision instance is created.

I considered allowing the precision to be passed as an option on monetize, but it seemed awkward to have the precision not match the backing column type. If you suddenly want more / less precision, you can simply change the column. Perhaps that was overly prescriptive though. Similarly, the current approach does not respect the global setting for precision Money.default_infinite_precision and instead favors the precision implied by the backing column type.

Uses work on `money` gem (ShippingEasy/money#2)
and the `monetize` gem (ShippingEasy/monetize#1)
to add infinite_precision support at the instance level.  Leveraging
that work these changes set the precision on the Money instance for a
model attribute based on that attributes backing column type.  If it is
backed by a :decimal column an infinite precision Money instance is
created.  Otherwise a normal precision instance is created.
Also provides a setting `infer_precision` that will tell `monetize` to
base the precision on the backing column type if it is not explicitly
provided.

For backwards compatability the feature works as follows:
  1. If an explicit option is provided to `monetize` that is used
  2. If no explicit option, and `infer_precision` is not set (defaults
     to false), then use the global `default_infinite_precision`.
  3. If no explicit option, and `infer_precision` *is* set, use
     `infinite_precision` if the attribute's column type is `:decimal`.
If `options[:infinite_precision]` is not set the default will
automatically be used.  There is no need to assign it explicitely.
Precision inference only works if the model's backing table already
exists.  If it does not, we are likely in a migration.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants