본문 바로가기

Ruby on Rails

루비 온 레일스를 배우는데 가장 큰 문제는 복수 단수 문제다!!!

아 지금도 쓸데없는 개고생을 한걸 생각하면 분노가 끓어 오르지만

참아야지 음.. 진정하고 후....

레일스는 모델 설정화일에서 간단하게 한줄만 넣어주면 조인이 미리 설정 된다.

그러니까 미리 테이블 간의 연관을 지어 놓으면, 나중에 조인해서 쿼리를 날리지 않아도 테이블 이름 두개를 쩜을 사이로 붙이는 형식으로 써주면 쿼리를 할 수가 있다는 말이다.

 한 한과에 학생은 여럿이지만 한 학생은 한 학과에 포함되는 것을 다음처럼 두개의 '모델' 화일로 표시한다.
(복수전공은 잠시 구석으로 가주세요..)

/model/student.rb
class Student < ActiveRecord::Base
 belongs_to :department
end

/model.department.rb
class  Department < ActiveRecord::Base
 has_many :student
end

이런식으로만 해 놓고,  students 테이블에는 department_id 필드만 넣어주면 설정 끝.

irb console에서 이렇게 쳐서 쿼리를 날리면

>>temp = Student.find(3)                    # id가 3번인 학생을 찾아내라

>>temp.department.classroom            # id가 3번인 학생이 있는 과의 교실이 몇호실이인지 써내라
=> 501호

이런 식으로 간편하게 된다는 말씀 무지 편하지 않은가? 게다가 객체지향적(이라고들 하더라)이다.

temp는 3번 student의 여러 정보를 가진 행렬(해쉬)이기도 하지만 학생 그자체가 아닌가
거기에 쩜 하나 찍고 department를 붙이니 바로 department의 필드인 classroom을  쓸수가 있게 되는 형국이다.

이건 물론 설정을 제대로 했을 경우다. 설정은 위에서 보듯이 간단 하다

그러나 여기에 간과 하기 정말 쉬운 것이있으니 테이블 네임과 belong_to 콜론 뒤에 쓸 '이름'을 무엇으로 쓰느냐이다. 영 다르면 틀린게 티가 확 나는데 다른 단어가 아니라 복수와 단수의 차이일 뿐이다.

모델명은 단수, 테이블 이름은 복수, 클래스명은 첫자만 대문자로 하는 .. 그런식이다. (사실 좀더 복잡함)

콘트롤러는 내 맘대로인데 스캐폴딩할 땐 복수로 자동 생성

그런데 belong_to 뒤에 콜론과 함께 쓰는 이놈이 문제다. 난 이걸 복수로 해서 테이블 이름과 같이 쓰는것으로 알고 있었다.
db/migaration/001_create_students.rb  화일 안에는   :students 라는 이름이 나온다. 난 이게 앞에 콜론도 달리고 해서 belongs_to 부류 의 뒤에 당연히 들어가려니 생각했다.

물론 책에도 그렇게 써 있는게 '반 이상 ' 된다. 
웃기지 않은가 '반이상' ㅎㅎ     그렇다  그  반 이상은 틀린거다.

내가 그 틀린 책들  보고 지금 껏 거기에 테이블 이름인 복수형을 써주는것으로 알고 있다가 영 조인된 결과가 안나와서 어제 밤부터 고심고심하다가 실수로 테이블 이름이 아닌 단수형으로 (그러니까 모델명 되겠다) 써놓은 것이 혼자 작동하는걸 보고 찾아내게 되었다.

책 쓴 사람들은 레일스  도사들 아니겠는가?  역자들도 물론 그렇다. 그들도 실수 할 정도니 말 다 한거 아닌가?

초기에 예제만 따라 하던때에도 그것 때문에 에러나서 고생 엄청 했는데 아직도 그 복수의 망령이 떠나지 않았다.

그제, 비트 교육센터 레일스 세미나에서 했던 강사분의 말씀도 그게 제일 헷갈린다고 하시고, 책의 코드도 틀린게 좀 있다고 하더니.. 정말  맞는 말이다.

여러분들도 모델간 관계 설정할때는 모델명을 써주시라. 꼭





PS: 물론 더 심각한 문제는 루비 문법 --;;
      그래도 이 모든 걸 커버해주는 간편함!