refactor ruby method
def get_payact_list(id)  
  ## Dont use class instance variables ( prefixed with @ ) for method scoped variables
  @temp="" # temp = ""
  ## In this case, you dont need the temporary variable, but lets keep it, but turn it into an array.
  # temp = [] 

  ## No need for the temp variable here, and still using class instance variables.
    @payacts=PayAct.find(:all, :conditions =&gt; {'product_id' =&gt; "#{id}".chop_space})
    @payacts.each do |item|
  # PayAct.find(:all, :conditions =&gt; {'product_id' =&gt; "#{id}".chop_space}).each do |item|

      @temp = @temp + "str1" + ": " + item.date + ", " + "str2" + ": " + item.summ + " " + "str3" + ", "
      ## Lets simply push each item onto the array.
      ## While we are at it, we remove the trailing comma string. 
      # temp &lt;&lt; "str1" + ": " + item.date + ", " + "str2" + ": " + item.summ + " " + "str3"

    end
    # No need to mangle the end of the string, as we can simply join the temp array with a comma, which will not add to the end.
    @temp = @temp[0,@temp.length-2] if @temp.length &gt; 1
    # temp.join ", "

    # no need for an explicit return. Ruby will return the value of the last expression.
  return @temp
end


Complete example, without changing too much.

def get_payact_list(id)  
  temp = [] 
  PayAct.find(:all, :conditions =&gt; {'product_id' =&gt; "#{id}".chop_space}).each do |item|
    temp &lt;&lt; "str1" + ": " + item.date + ", " + "str2" + ": " + item.summ + " " + "str3"
  end
  temp.join ", " # is implicitly returned.
end


We can do away with the temp variable by using collect() instead of each() and pushing to an array.

def get_payact_list(id)  
  list = PayAct.find(:all, :conditions =&gt; {'product_id' =&gt; "#{id}".chop_space}).collect { |item|

    "str1" + ": " + item.date + ", " + "str2" + ": " + item.summ + " " + "str3" 
  } 
  list.join ", "
end  


Lets go the whole way, here are our new methods

This still looks and feels like duplication, but without a bit more 
metaprogramming than I want to go into right now, it will do.
At least the separate concerns are factored out.

  def get_payact_list id 
    format_act_list PayAct.find_by_product_id(id).collect { |item| 
      [item.date, item.summ]
    }
  end

  # Note: the get_data method should be encapsulated on the item, leaving as is for now.
  def get_stageact_list id 
    format_act_list StageAct.find_by_product_id(id).collect { |item| 
      [ get_data(item.type_id,"type"), item.summ ] 
    }
  end

  def get_resentact_list id
     format_act_list ResentAct.find_by_product_id(id).collect { |item| 
       [ get_data(item.shop_id,"resentact"), item.cost ]
     }
  end


  def format_act_list list
    list.collect { |item| format_tuple(item) }.join ', '
  end

  # Takes an array and correctly formats the output
  # Ideally this would live in a presenter or a view. 
  def format_tuple tuple 
    "str1: %s, str2: %s str3" % [ tuple[0],  tuple[1] ]
  end


And this is the supporting code.

class Act
  # I've moved this common finder method up the (fake) chain of inheritance I invented.
  # It could also live in each of the child objects i.e ( PayAct StageAct ResentAct )
  def self.find_by_product_id (product_id)
    self.find(:all, :conditions =&gt; {'product_id' =&gt; "#{product_id}".chop_space}) 
  end
end

class PayAct &lt; Act;end
class StageAct &lt; Act; end
class ResentAct &lt; Act; end