Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
shaynekang opened this issue Oct 18, 2014 · 1 comment
Open

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

shaynekang opened this issue Oct 18, 2014 · 1 comment

Comments

@shaynekang
Copy link

레일즈 모델에는 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 = "[email protected]"
=> "[email protected]"
irb(main):076:0> user.username = "test"
=> "test"
irb(main):077:0> user.attributes
=> {"id"=>nil, "email"=>"[email protected]", "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, "[email protected]", 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
Copy link

유용하게 쓰일것같네요 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants