Outputting a string from an array of objects

Hi All,

Newbie here working with an existing Rails project. I'm trying to create a method that will return a simple string of object values.

I have an app that has companies that each are assigned to one or more branches. Then I have a contact who is assigned to a company. I've created an association with belongs_to for both the company and branch, and the branch and company has their own class in AR.

So

def get_company_branches

   my_branches = self.company.branches
   my_list = my_branches.each { |x| puts x.branch_name }
   return my_list
end

For some reason this returns an object id (the raw ruby object id I think) not the string i am looking for. Any suggestions?

Best,

Peter

puts just dumps things to stdout, so you definitely don't want to be
using that here.
If you want to create an array based on the value of each object in a
collection then you should use collect (also available as map). It
creates a new array containing the result of evaluating the block for
each object of the original collection.

Fred

Thanks Fred!

Does this look right? I'm still getting an error for some reason:

def get_company_branches

   my_branches = self.company.branches
   my_list = my_branches.branch_name.collect! { |x| x + "," }
   return my_list
end

looking for it to output a concatenated string - still erroring out tho. :frowning:

Peter

You might find that something like this is what you're after:

  def get_company_branches
self.company.branches.collect(&:branch_name).join(", ") if
self.company && self.company.branches
  end

Have a look at the methods available to Array and Enumerable in both
the Rails and Ruby apis.

Always post the error... just saying "I've got one" doesn't help
people point out where you might be having problems (although in this
case, it's ruby syntax... check the API for the ".collect" method :slight_smile:

def get_company_branches
my_branches = self.company.branches # you don't really need these
intermediate variables... just use self.branches.collect....
my_list = my_branches.collect { |x| x.branch_name }
return my_list.join(", ") # "collect" returns an array, so we can
join the array into a string, or maybe use the "to_sentence" extension
to prettify it
end

...my previous method just does the same, a little more compact.

Thanks Fred!

Does this look right? I'm still getting an error for some reason:

def get_company_branches

my_branches = self.company.branches
my_list = my_branches.branch_name.collect! { |x| x + "," }
return my_list
end

You need to call collect (you don't want collect!) on the array, not
on the branch_name for an individual branch

Fred