additional model attributes

9 views
Skip to first unread message

Lukas M.

unread,
Oct 25, 2011, 9:03:23 AM10/25/11
to rubyonra...@googlegroups.com
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


==========================================
place.rb

class Place < ActiveRecord::Base
attr_accessor: address
end

==========================================
places_controller.rb

external_api_place_data = @client.find(place_id)
place = Place.new
place.name = place.name
place.id = place.id

//not showing up in the json result
place.address = external_api_place_data.address

places = []
places << place

respond_to do |format|
format.html # index.html.erb
format.json { render json: places }
end

==========================================

--
Posted via http://www.ruby-forum.com/.

Frederick Cheung

unread,
Oct 25, 2011, 9:10:09 AM10/25/11
to rubyonra...@googlegroups.com, rubyonra...@googlegroups.com

On 25 Oct 2011, at 14:03, "Lukas M." <li...@ruby-forum.com> wrote:

> 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.

>
> any hints?
>
> thanks
>
>
> ==========================================
> place.rb
>
> class Place < ActiveRecord::Base
> attr_accessor: address
> end
>
> ==========================================
> places_controller.rb
>
> external_api_place_data = @client.find(place_id)
> place = Place.new
> place.name = place.name
> place.id = place.id
>
> //not showing up in the json result
> place.address = external_api_place_data.address
>
> places = []
> places << place
>
> respond_to do |format|
> format.html # index.html.erb
> format.json { render json: places }
> end
>
>
>
> ==========================================
>
> --
> Posted via http://www.ruby-forum.com/.
>

> --
> You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
> To post to this group, send email to rubyonra...@googlegroups.com.
> To unsubscribe from this group, send email to rubyonrails-ta...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
>

Lukas M.

unread,
Oct 25, 2011, 9:34:03 AM10/25/11
to rubyonra...@googlegroups.com
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

Tim Shaffer

unread,
Oct 25, 2011, 9:52:29 AM10/25/11
to rubyonra...@googlegroups.com
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.

Lukas M.

unread,
Oct 25, 2011, 11:00:47 AM10/25/11
to rubyonra...@googlegroups.com
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.

Peter Vandenabeele

unread,
Oct 25, 2011, 11:17:26 AM10/25/11
to rubyonra...@googlegroups.com
On Tue, Oct 25, 2011 at 5:00 PM, Lukas M. <li...@ruby-forum.com> wrote:
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.

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

Frederick Cheung

unread,
Oct 25, 2011, 11:16:53 AM10/25/11
to rubyonra...@googlegroups.com, rubyonra...@googlegroups.com

On 25 Oct 2011, at 16:00, "Lukas M." <li...@ruby-forum.com> wrote:

> 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


>
> --
> Posted via http://www.ruby-forum.com/.
>

Jeff Lewis

unread,
Oct 25, 2011, 12:43:39 PM10/25/11
to Ruby on Rails: Talk
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

On Oct 25, 8:16 am, Frederick Cheung <frederick.che...@gmail.com>
wrote:
> On 25 Oct 2011, at 16:00, "Lukas M." <li...@ruby-forum.com> wrote:
>
> > 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
>
>
>
>
>
>
>
>
>
> > --
> > Posted viahttp://www.ruby-forum.com/.
Reply all
Reply to author
Forward
0 new messages