[rails] 반복문 질문입니다.


  • Level 9

    45ea97ac-9b62-4ca7-a3c1-e269f5327583-image.png

    코드의 @userscore 는 Score모델이라고 생각해주시면 됩니다. Score 모델은 score1, score2, score3, score4, score5 의 다섯개의 컬럼을 가지고 있습니다. 컬럼명을 변수처리해서 반복문으로 구현 할 수 있는지 궁금합니다

    1. 이런 식의 코드를 구현 했는데 반복문으로 처리 할 수 있을까요?
    2. 고수분들이라면 이 코드를 반복문으로 처리하실까요? 반복문으로 처리하는것이 속도에 영향을 줄까요? (제가 본 어느글에서는 무조건 반복문으로 속도에 도움을 주지만은 않는다고 해서요)
  • DevelUP HQ
    Level 10

    @gamrom

    5.times do |i|
      eval("@userscore.score#{i + 1}")
    end
    

    ruby 에서는 코드가 코드를 만드는 메타프로그래밍 방식을 자주 사용합니다.

    그 때 사용하는 코드가 eval 입니다.
    eval 은 문자열을 그대로 코드로 실행하게 합니다.

    eval 에는 아래와 같은 장단점이 있으니 잘 판단 후 사용하시면 됩니다.

    장점 : 동적 구문 생성, 바인딩, 실행. 메타프로그래밍에 유용.
    단점 : 느림, 스코프를 넘어선 자원 접근, 보안.

  • Level 9

    @gamrom 모델에 대한 반복문 활용은 보통 대게 each do 문법을 많이 활용하는 방식입니다.
    (each do는 반복문 개념은 아니긴 하나, 반복문 처럼 행동한다는 사실은 잘 인지해주세요.)

    each do 얘기가 나온 김에 each do 동작원리 및 몇개의 예시를 간단히 설명드릴게요.

    1. 일단 Score라는 모델은 여러 개의 데이터를 가지고 있는데 이걸 한 row씩 나눠야 하는 작업이 필요합니다.
      그래서 each do 문법으로 하나하나씩 보여주고, 데이터의 끝에 다다를 때 까지 반복문 처럼 looping을 합니다.
      더불어, 하나 하나의 데이터 컬럼(에트리뷰트; score1..score5)에 대해 다뤄야 하는 필요도 있어서 람다라는 메소드 호출 함수(혹은 이름없는 변수)를 지어줍니다.
      예시 : Score.all.each do |t|
    • 여기서 t 라는 문자가 별개의 에트리뷰트를 다룰 람다 입니다.
    1. 이제 each do 블록 내에서 각 데이터 별로 람다를 이용해서 Score 내 에트리뷰트 제어가 이루어집니다.
      (만약 Score 내 데이터가 3개 있는 경우 each do는 3번 looping이 이루어집니다.)
    Score.all.each do |t|
        t.score1
        t.score2
        t.score3
        t.score4
        t.score5
    end
    

    1). 조건문을 넣어서 에트리뷰트 별로 제어를 할 수 있습니다.

    Score.all.each do |t|
        if t.score1 >= 50
            t.score1
            t.score2
            t.score3
            t.score4
            t.score5
        else
            flash[:message] = "불합격 입니다."
        end
    end
    

    2). each do 문법 속에 따로 루비문법을 추가할 수 있습니다.

    Score.all.each do |t|
        for i in 1..t.score1.to_i
            puts "★"
        end
    end
    # 만약 Score 모델에서 id=3인 데이터에서 score1이 50인 경우, ★을 50번 출력 
    

    3). 필요에 따라선 each do의 람다와, 흔히 반복문에서 볼 수 있는 index값과 함께 혼용이 가능합니다.

    • index 값은 0부터 시작
    Score.all.each_with_index do |t, i|
        puts "#{t.score1} / #{i}"
    end
    

    위 코드에서 첫 번째에 있는 t가 람다, 두 번째에 있는 i가 index 입니다.

  • Level 9

    @gamrom 모델에 대한 반복문은 보통 대게 each do 문법을 많이 활용하는 방식입니다.

    1. 일단 Score라는 모델은 여러 개의 데이터를 가지고 있는데 이걸 한 row씩 나눠야 하는 작업이 필요합니다.
      그래서 each do 문법으로 하나하나씩 보여주고, 데이터의 끝에 다다를 때 까지 반복문 처럼 looping을 합니다.
  • Level 9

    This post is deleted!
  • Level 1

    1. 반복문으로 작성하시려면
    @userscore.attributes.each do |k, v| 
      v if k.to_s.include? "score"
    end
    

    정도로 하면 반복문 처리는 가능할 것 같습니다!

    1. 반복문으로 처리해서 코드 라인 수를 줄이고자 하거나 아니면 헬퍼 메소드로 사용해서 다른 곳에도 쓰인다면 헬퍼 메소드로 처리하는 것도 좋을 것 같습니다.
      위의 코드로 보면 모든 컬럼을 반복문 도니까 속도 자체는 느리겠지만 큰 차이는 없을 것 같습니다...!

ONLINE USERS

POPULAR TOPICS

SUGGESTED TOPICS