Hi,

I have non-ActiveRecord Ruby classes that I use for numerical (and
other) processing as part of an API service.

I seem to recall that AR will cast attributes, say, from a params hash,
into the data type expected for the attribute. That is useful, and I'm
missing that feature in my non-AR classes. Has anyone considered this
challenge in their own work, and, if so, what mechanism (existing
modules or code snippets) would they propose as a way to introduce
casting?

Thanks,

Grar

--
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 rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

Search Discussions

  • Peter De Berdt at Nov 4, 2011 at 3:25 pm

    On 04 Nov 2011, at 15:01, Grary Stimon wrote:

    I have non-ActiveRecord Ruby classes that I use for numerical (and
    other) processing as part of an API service.

    I seem to recall that AR will cast attributes, say, from a params
    hash,
    into the data type expected for the attribute. That is useful, and I'm
    missing that feature in my non-AR classes. Has anyone considered this
    challenge in their own work, and, if so, what mechanism (existing
    modules or code snippets) would they propose as a way to introduce
    casting?
    Something along the lines of https://gist.github.com/1339540 (put it
    in the lib/ directory and include it in load path if needed) should
    work.

    Then you just create a custom class, e.g. an ActiveModel class:

    class CustomModel
    include ActiveModel::Validations
    include ActiveModel::Conversion
    include ActiveModel::Serializers::JSON
    include ActiveModel::Serializers::Xml
    extend ActiveModel::Naming

    include TypeCaster

    field :id, Integer
    field :name, String
    field :description, String
    field :some_integer, Integer

    validates_presence_of :id, :name
    validate_numericality_of :some_integer

    def persisted?
    false
    end
    end

    Just doing this off the top of my head, so might be some typos in
    there, but you get the point.

    I'd use this method so your custom classes at least have some notion
    of what to expect, that's what ActiveRecord also does (using the
    database column types).

    You can then just pass in a json hash to the constructor:

    CustomModel.new(params)

    where params is a json hash like {name: "John Doe", id: 123,
    description: "Some anonymous man", some_integer: 5}

    Even if for some reason that some_integer would be passed in as a
    string, your custom model would still typecast it to an integer, since
    your model enforces it to.


    Best regards

    Peter De Berdt

    --
    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 rubyonrails-talk@googlegroups.com.
    To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
    For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
  • Peter De Berdt at Nov 4, 2011 at 3:31 pm

    On 04 Nov 2011, at 16:24, Peter De Berdt wrote:

    You can then just pass in a json hash to the constructor:

    CustomModel.new(params)

    where params is a json hash like {name: "John Doe", id: 123,
    description: "Some anonymous man", some_integer: 5}
    I stand corrected, where params is a normal Ruby hash (my weekend has
    started, my mind is slowing down ;-))


    Best regards

    Peter De Berdt

    --
    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 rubyonrails-talk@googlegroups.com.
    To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
    For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
  • Grary Stimon at Nov 4, 2011 at 4:50 pm
    Peter,

    Wow, that's a lot!

    One of my reasons for posting was I saw
    ActiveModel::Serializers#from_json and I thought, 'What good is this, if
    there is not some other facility to handle non-String attributes?' It
    seems, though, that the functionality you have so generously sketched is
    just not available via some overriding of AM modules.

    Thanks,

    Grar

    --
    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 rubyonrails-talk@googlegroups.com.
    To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
    For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouprubyonrails-talk @
categoriesrubyonrails
postedNov 4, '11 at 2:01p
activeNov 4, '11 at 4:50p
posts4
users2
websiterubyonrails.org
irc#RubyOnRails

2 users in discussion

Grary Stimon: 2 posts Peter De Berdt: 2 posts

People

Translate

site design / logo © 2021 Grokbase