Skip to content

Commit 2ca99c0

Browse files
committed
Ignore converted methods when writing cents
1 parent df7a030 commit 2ca99c0

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ platforms :jruby do
99
end
1010

1111
platforms :ruby do
12-
gem "sqlite3"
12+
gem "sqlite3", "~> 1.4"
1313
end
1414

1515
platform :mri do

lib/money-rails/active_record/monetizable.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def monetize(*fields)
132132
# the subunit value directly
133133
define_method "#{subunit_name}=" do |value|
134134
instance_variable_set "@#{name}_money_before_type_cast", nil
135-
write_attribute(subunit_name, value)
135+
write_cents(subunit_name, value)
136136
end
137137
end
138138

@@ -205,7 +205,7 @@ def read_monetized(name, subunit_name, options = nil, *args, **kwargs)
205205
result = memoized
206206
else
207207
memoized_amount = memoized.amount.to_money(attr_currency)
208-
write_attribute subunit_name, memoized_amount.cents
208+
write_cents subunit_name, memoized_amount.cents
209209
# Cache the value (it may be nil)
210210
result = instance_variable_set("@#{name}", memoized_amount)
211211
end
@@ -262,9 +262,9 @@ def write_monetized(name, subunit_name, value, validation_enabled, instance_curr
262262
# (Note: 'attribute_aliases' doesn't exist in Rails 3.x, so we
263263
# can't tell if the attribute was aliased.)
264264
original_name = self.class.attribute_aliases[subunit_name.to_s]
265-
write_attribute(original_name, money.try(:cents))
265+
write_cents(original_name, money.try(:cents))
266266
else
267-
write_attribute(subunit_name, money.try(:cents))
267+
write_cents(subunit_name, money.try(:cents))
268268
end
269269

270270
if money_currency = money.try(:currency)
@@ -299,6 +299,13 @@ def currency_for(name, instance_currency_name, field_currency_name)
299299
Money.default_currency
300300
end
301301
end
302+
303+
def write_cents(attribute_name, cents)
304+
# ignore converted methods
305+
return unless has_attribute? attribute_name
306+
307+
write_attribute(attribute_name, cents)
308+
end
302309
end
303310
end
304311
end

spec/active_record/monetizable_spec.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ def assert_monetized_attributes(monetized_attributes, expected_attributes)
105105
expect(transaction.amount_cents).to eq(20000)
106106
end
107107

108+
it "update to instance currency field gets applied to converted methods" do
109+
transaction = Transaction.create(amount: '200', tax: '10', currency: 'USD')
110+
expect(transaction.total).to eq(Money.new(21000, 'USD'))
111+
112+
transaction.currency = 'CAD'
113+
expect(transaction.total).to eq(Money.new(21000, 'CAD'))
114+
end
115+
108116
it "raises an error if trying to create two attributes with the same name" do
109117
expect do
110118
class Product

0 commit comments

Comments
 (0)