Jatto_abdul
Jatto_abdul

Reputation: 109

Using money-rails with mongoid: How to set currency per model instance

I'm currently using:

money-rails v1.12 rails v6 mongoid v7

I would like to set the default currency to be used by each model instance.

I have set the field in my model like below

field :price, type: Money, with_model_currency: :currency

But when I try to create or fetch records I get this error

Mongoid::Errors::InvalidFieldOption
message:
  Invalid option :with_model_currency provided for field :price.

How do I use the with_model_currency option in a rails mongoid application? How else can I handle money in a rails mongoid application?

Upvotes: 0

Views: 440

Answers (1)

cesartalves
cesartalves

Reputation: 1585

When you use type: Money in a mongoid field, you're indicating that the field should be serialized / deserialized with that class in particular. RubyMoney includes methods for serializing to mongo. with_model_currency is not a valid option for the macro field.

You're confusing the method with the money-rails monetize, which DOES have an option named with_model_currency.

In one sentence: drop the with_model_currency: :currency option, it's not available on mongoid fields.

If you want to set a default currency, you will need to do so using Money.default_currency = Money::Currency.new("CAD").

You might also want to write your own serializer (this was not tested):

class MoneySerializer

    class << self

        def mongoize(money)
            money.to_json
        end

        def demongoize(json_representation)
            money_options = JSON.parse json_representation
            Money.new(money_options['cents'], money_options['currency_iso']
        end

        def evolve(object)
            mongoize object
        end
    end
end



field :price, type: MoneySerializer

Relevant docs:

Upvotes: 2

Related Questions