4

I am just starting to use the array data-type in Postgres with Rails 4 but I am having trouble getting values on an existing array to update. I have a column called 'quantity' that is an array of integers( [0,0] ). I want to update the value at 'quantity[0]' and I have tried the following in the console:

a = Asset.find(2) 
=> #<Asset id: 2, quantity: [0,0]>

a.quantity[0] = 5
=> 5 

a.quantity_will_change! 
=> [5, 0] 

a.save
=> true

a.reload
=> #<Asset id: 2, quantity: [0,0]>

As you can see, the asset object's quantity value is change but when I try to save the object using 'a.save' the change is not reflected when I reload the object.

Any help would be greatly appreciated.

Thanks

2
  • 1
    quantity_will_change! or replacing the whole array should work. Is there something going on that we can't see? Commented Nov 14, 2013 at 23:23
  • 1
    @muistooshort : you were 100% correct. I had a callback on my model that was altering the values. I appreciate the help. Commented Nov 19, 2013 at 16:49

2 Answers 2

2

My reading of http://apidock.com/rails/ActiveRecord/Dirty is that you have to call ..._will_change! before you change the attribute. You should be able to confirm this by examining changes under various scenarios.

Update: I just tested the behavior with a string attribute, and it still saves the updated string even if the change was made before ..._will_change is called, so my interpretation may be off.

Sign up to request clarification or add additional context in comments.

2 Comments

Hey Peter, I have tried using quantity_will_change! both before and after setting the value. The changes method does in fact show that the value was changed. Any other ideas? Thanks for your help.
Only thing I can think of is what @muistooshort indicated, that something else is going on (e.g. within your model that is "resetting" things).
1

<attribute>_will_change! will only update value if array has been replaced. In-place modifications like []= won't be saved at all.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.