Onze dagmethode #4: Hash#excluding en Hash#only
Geplaatst door Remco van 't Veer vr, 08 feb 2008 08:00:00 GMT
Dit ziet er vast bekend uit:
u = params[:user]
attr = if u[:password].blank?
u.reject do |k,_|
[:password, :password_confirmation].include?(k)
end
end
User.update_attributes(attr || u)
Maar ruikt naar een herbruikbaar truukje, want willen we niet gewoon het volgende schrijven:
u = params[:user]
attr = if u[:password].blank?
u.excluding(:password, :password_confirmation)
end
User.update_attributes(attr || u)
Simpel te implementeren, inclusief z’n only
broertje, met:
class Hash
def excluding(*keys)
reject{|k,_| keys.include?(k)}
end
def only(*keys)
reject{|k,_| !keys.include?(k)}
end
end
Disclaimer: het bovenstaande voorbeeld werkt niet in Rails omdat params
een “hash with indifferent access” is. Het maken van een onverschillige variant laat ik aan jou over! :)