You can do this:

    Hash[ preferences.map {|k,v| [k.to_sym, v.nonzero? or false]} ]

This preserves the value if it is nonzero, otherwise makes it false. It does not change a 1 to true though. I like @tokland's answer best, because it not only does the exact transformation you want, but makes it easy to extend and use as a general purpose transformer (if you ever need to change other values as well), which one might assume is your purpose for this method, based on the name.

**Code review**

Note that when you initialize a return variable and then loop over another variable, e.g.

    hsh = {}
    preferences.each do
      #something that updates hsh
    end

A more idiomatic Ruby way to do this is with a `map`, as the answers show. This will in general result in more concise, expressive code.