Hey guys,

I had recently a very weird experience. I have a Loader class that run's a 
lot of different things on Active Record objects. One thing this loader 
does, is to preload data based on each classes settings. so basically:

scope.preload(preloads)

scope has a collection of Active Record objects. 
preloads has an array with hashes inside that show what information to 
preload for each relation.
Preloads use to be a function inside the loader class that calculated that 
array, but it needed some information of the class itself, so I refactored 
it out into another class.

This is an example how the code works, the implementation is not very 
important and I simplified it for the sake of the example:

Class Incident
  def preloads
    # calculate preloads
  end

  def load
    Loader.new(preloads)
  end
end

Class Loader < Struct.new(:preloads)
  def initialize(opts = {})
    self.preloads = opts[:preloads] || []
  end

  def load
    scope.preload(preloads)
  end
end

So before the preloads when inside of the loader class return something 
like(Every key is a symbol):

[{:updated_by_user=>[]}, {:service=>[{:account=>:additional_fields}, 
{:service_customers=>{:customer=>[]}}]}, {:owner=>[]}, 
{:closed_by_user=>[]}, {:assigned_user=>[]}, 
{:beetil=>{:satisfaction_ratings=>[]}}, 
{:beetil=>{:additional_values=>:additional_field}}, 
{:beetil=>{:additional_values=>:additional_field}}, :priority, :priority, 
:service_activity_type, {:beetil=>{:customer_beetils=>{:customer=>[]}}}, 
{:beetil=>:audit_trail_groups}, {:beetil=>:latest_audit_trail_group}, 
:incident_status, :received_by_user, {}, {}]
And when passed as an argument is transformed into(Every key is a string):

[{"updated_by_user"=>[]}, {"service"=>[{"account"=>:additional_fields}, 
{"service_customers"=>{"customer"=>[]}}]}, {"owner"=>[]}, 
{"closed_by_user"=>[]}, {"assigned_user"=>[]}, 
{"beetil"=>{"satisfaction_ratings"=>[]}}, 
{"beetil"=>{"additional_values"=>:additional_field}}, 
{"beetil"=>{"additional_values"=>:additional_field}}, :priority, :priority, 
:service_activity_type, {"beetil"=>{"customer_beetils"=>{"customer"=>[]}}}, 
{"beetil"=>:audit_trail_groups}, {"beetil"=>:latest_audit_trail_group}, 
:incident_status, :received_by_user, {}, {}]
But the problem is then I get an error of the load function saying:

TypeError:  Cannot visit String

After I googled a little bit and debugged I realized that it worked with 
the keys as symbols and not as strings.

How weird is that? so load only accepts keys with symbols and not strings? 
is this a rails bug? am I approaching this wrong?

Any input would be appreciated.

all the best,

Andre

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/081b0178-18d9-4c67-b4be-0c4d484bd82a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to