11155
(-- --)
October 25, 2011, 1:03pm
1
Hi,
i have a "place" model with 2 columns (id, name).
I'm calling an external api which gives me data to create a new place
object.
I would like to add the address from the external place to the place
object and render it as a json result, without storing it in the
database.
i don't get any errors, but the address never shows up within the json
output. i've tried with attr_accessor but that didn't work either.
any hints?
thanks
Hi,
i have a "place" model with 2 columns (id, name).
I'm calling an external api which gives me data to create a new place
object.
I would like to add the address from the external place to the place
object and render it as a json result, without storing it in the
database.
i don't get any errors, but the address never shows up within the json
output. i've tried with attr_accessor but that didn't work either.
foo.to_json(:methods => [:attr1, :attr2])
Maybe? (assuming that foo.attr1 returns one of your extra attributes)
Fred.
11155
(-- --)
October 25, 2011, 1:34pm
3
hi,
that works but not in the case when i would like to do something like
this:
user_place = Location.new(:place => place, :user => user)
user_place.to_json //address is missing
I think for Rails to recognize that the attribute should be included, you need to use attr_accessible rather than the Ruby method attr_accessor.
11155
(-- --)
October 25, 2011, 3:00pm
5
hm.. no luck with that either. when i try to print out the places object
in the console (logger.debug @place.to_yaml ), "address" is missing.
hm.. no luck with that either. when i try to print out the places object
in the console (logger.debug @place.to_yaml ), "address" is missing.
For json at least you could override the as_json method to add the attributes you want.
Fred
From the top of my head (not hard tested now).
Now you refer to to_yaml, in previous mails, you refered to to_json.
Be careful, there is a fundamental difference between to_xml, to_json,
to_yaml on ActiveRecord …
One of them (I believe to_yaml) prints the “raw” database column values,
even if you overwrite that accessor function with a name. The other two
(to_json, to_xml IIRC) use the attribute accessors (from ActiveRecord I
presume), that can be overwritten by your own code.
So, I would expect to_yaml to never work in this scenario (where there is
no database column). But to_json should be possible in this scenario
(I did some simple tests with ActiveModel and that seemed to work as
expected).
HTH,
Peter
Jeff_Burly
(Jeff Burly)
October 25, 2011, 4:43pm
8
One alternative in terms of dynamically adding an attribute to a model
instance (without having to have pre-defined any attr_... in the
class):
...
place = Place.new
place.name = place.name
place.id = place.id
place['address'] = external_api_place_data.address
...
From then on, for that instance, you can call place.address, and it
will show up in place.to_json (since to_json is generated from
place.attributes, which now has a k/v for address in attributes).
Jeff