Skip to content

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

Open
marcusmateus wants to merge 4 commits intomasterfrom
marcus/add_per_attribute_infinite_precision
Open

Enables infinite precision on Money attributes based on column type#1
marcusmateus wants to merge 4 commits intomasterfrom
marcus/add_per_attribute_infinite_precision

Conversation

@marcusmateus
Copy link
Copy Markdown
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