DonutWorks / Ari

0 stars 0 forks source link

모델의 attributes, 해시의 keys/values를 활용하기 #326

Open shaynekang opened 10 years ago

shaynekang commented 10 years ago

레일즈 모델에는 attributes라는 메소드가 있습니다. 현재 모델 인스턴스에서 가지고 있는 컬럼과 그 값을 반환하는 역할을 합니다

irb(main):074:0> user = User.new
=> #<User id: nil, email: nil, created_at: nil, updated_at: nil, username: nil, phone_number: nil, major: nil, student_id: nil, sex: nil, home_phone_number: nil, emergency_phone_number: nil, habitat_id: nil, member_type: nil, generation_id: nil, birth: nil>
irb(main):075:0> user.email = "test@example.com"
=> "test@example.com"
irb(main):076:0> user.username = "test"
=> "test"
irb(main):077:0> user.attributes
=> {"id"=>nil, "email"=>"test@example.com", "created_at"=>nil, "updated_at"=>nil, "username"=>"test", "phone_number"=>nil, "major"=>nil, "student_id"=>nil, "sex"=>nil, "home_phone_number"=>nil, "emergency_phone_number"=>nil, "habitat_id"=>nil, "member_type"=>nil, "generation_id"=>nil, "birth"=>nil}

또한 해시에는 keys라는 메소드와 values라는 메소드가 있습니다. 각각 해시의 키와 값을 반환합니다.

irb(main):078:0> user.attributes.keys
=> ["id", "email", "created_at", "updated_at", "username", "phone_number", "major", "student_id", "sex", "home_phone_number", "emergency_phone_number", "habitat_id", "member_type", "generation_id", "birth"]
irb(main):079:0> user.attributes.values
=> [nil, "test@example.com", nil, nil, "test", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]

이를 활용하면 레일즈 코드를 좀 더 간결하게 고칠 수 있습니다. 가령 현재 사용자(User) 모델에 다음과 같은 코드가 있는데,

def strip!
  strip_to = [:username, :email, :major, :student_id, :sex, :home_phone_number, :emergency_phone_number, :habitat_id, :member_type, :birth ]
  strip_to.each{|column| self[column].strip! if self[column]}
end

이를 다음과 같이 고칠 수 있습니다.

def strip!
  self.tap do
    attributes.values.each do |value|
      value.strip! if value
    end
  end
end

이 코드는

  1. 좀 더 간결하고
  2. 사용자 모델에 새로운 컬럼이 생겼을 경우 자동으로 strip!을 해줍니다.

다른 코드도 attributeskeys/values를 활용해서 리펙토링 하면 좋겠습니다. ㅎㅎ

minhyeok4dev commented 10 years ago

유용하게 쓰일것같네요 :+1: