2011-03-11 12 views
2

잘하면이 하나에 대해 너무 심하게 타오르지는 않을 것입니다. 아무런 도움이되지 않을 정도로 열심히 노력했습니다.Ruby on Rails에서 연관성 선언하기

누군가가 Ruby on Rails (3)에서 연결을 올바르게 선언하는 방법을 알아낼 수 있는지 궁금합니다.

#room.rb 
class Room < ActiveRecord::Base 
    has_many :check_ins 
end 

#check_in.rb 
class CheckIn < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :room 
end 

#user.rb 
class User < ActiveRecord::Base 
    has_one :check_in 
end 

지금까지, 내 ​​모든 테이블에 foreign_key 열을 추가 할 수있는 마이그레이션을 완료하지 않은 (레일 당신을 위해이 일을합니까?) :이 순간, 나는 3 개 모델이있다.

나는에 대한 혼란 스러워요 왜 명령 User.first.check_in 반환 SQLite3::SQLException: no such column 반면 명령 CheckIn.first.user 반환 nil. CheckIn.first.roomRoom.first.check_ins에 대해서도 마찬가지입니다. User.first.check_in이 첫 번째 사용자와 연결된 CheckIn 객체를 반환하고 Room.first.check_ins이 첫 번째 방과 관련된 CheckIn 집합을 반환하도록하려면 어떻게해야합니까?

어떤 도움을 주시면 감사하겠습니다.

찰리

답변

4

원래이 모델을 어떻게 생성 했습니까? 모델 파일을 만들었습니까? 또는 레일스 모델 생성기를 사용 했습니까? 당신은 당신을 위해 이러한 테이블을 설정 마이그레이션을 가지고 있는지 확인해야합니다 34612525162_something_something.rb dB/마이그레이션 /에서

#room.rb 
class Room < ActiveRecord::Base 
    has_many :check_ins 
end 

#check_in.rb 
class CheckIn < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :room 
end 

#user.rb 
class User < ActiveRecord::Base 
    has_one :check_in 
    has_one :room, :through => :check_in 
end 

. 이러한 그

rails generate model user name:string email:string otherfield:integer 
rails generate model check_in user_id:integer room_id:integer 
rails generate model room number:integer 

참고 : 당신이 그것을 콘솔에서이 명령을 실행하는 것입니다 할 원하는 필드를 사용하는 명령을 수정하기위한 가장 쉬운 방법은 * _id 필드가 작동하도록 협회에 필요 이 3 개의 모델 파일을 이미 갖고 있기 때문에 모델 파일을 생성 할 것입니다.이 모델 파일을 덮어 쓰거나 파일을 건너 뛰려면 물어볼 것입니다. 당신은 그들을 건너 뛸 수 있고 그것은 잘되어야합니다. 이미 다음 방금이 발전기를 실행하는 대신하여 check_in 모델에 USER_ID와 room_id 필드를 추가 할 수 있습니다 이러한 모델의 데이터 부분에 대한 마이그레이션을 한 경우 :

rails generate migration AddIdsToCheckIn user_id:integer room_id:integer 

레일 2.3.x를 들어 rails generate 교체 script/generate. 다음으로 db/migrate.rb에있는 파일을 열어 마이그레이션을 검사하고 필요한 경우 수정할 수 있습니다.마지막으로 마이그레이션을 실행하십시오.

rake db:migrate 

그리고 잘 해결됩니다. 사용자에게 has_one, :through => 관계를 추가했음을 유의하십시오. 이는 체인을 만들 필요없이 @user.room을 수행 할 수 있도록하기위한 것입니다. @user.check_in.room

+0

그레이트 대답 - 매우 설명! 필자가 놓친 주요 아이디어는 마이그레이션을 통해 check_in에 user_id 및 room_id 열을 추가해야한다는 것이 었습니다. 또한': through' 아이디어에 대한 조언을 주셔서 감사합니다. – candrews

0

당신은 마이그레이션을 추가해야 자신 (당신이 살고 있지 않은 경우 또는 기존 마이그레이션을 수정할 수 있습니다). 기본적으로 관계의 belongs_to 부분에 외래 키를 제공해야합니다.

+0

위대한 결과를 얻었습니다! 내가이 같은 마이 그 레이션을 생성하기 위해 사용하는 명령은 (앞으로 이것을 발견 할 수있는 사람들을 위해)'rails g migration add_room_id_to_check_ins room_id : integer' (분명히'rake db : migrate'가 뒤 따른다)입니다. 도와 주셔서 감사합니다! – candrews

+0

@ cannrews 분명히 나는 ​​너무 느리게 입력한다 : p – nzifnab

+0

하하, 글쎄, 그들은 모두 좋은 대답이었고, 하나는 조금 빨랐다. 나는 찢어진다고 느꼈다. = – candrews

0

화염에 빠질 이유가 없습니다. 걱정하지 마세요. 당신이 일대일 협회를하려고하는 것처럼 보이지만, 실제로는 많은 것을하고 있습니다.

사용자가 한 번 체크인하면 한 방이 있음을 의미합니다. 그래서, 당신은 할 수 : 객실에는 USER_ID를 가지고 사용자

룸에 속하는

사용자 has_one 룸.

도움이 되길 바랍니다. :)

+0

하하, 자신감 부스트에 대해 고맙다. = p 필자는 내 질문에 좀 더 폭이 좁혀 야했다. CheckIn에 다른 속성이있어 CheckIn을 갖게 만든다. 자체 모델. 케빈의 대답은 올바른 방향으로 나를 가리켰다. 그래서 나는 그것을 알아 냈다. 고맙습니다! – candrews

+0

당신은 환영합니다. 당신이 모든 것을 가지고있어 기쁘다. :) – Spyros

관련 문제