[ruby-on-rails] 레일스 : 레일에서 has_one 연관으로 빌드 사용

이 예에서는 userno profile로을 만든 다음 나중에 profile해당 사용자에 대한을 만듭니다 . has_one협회 와 함께 빌드를 사용해 보았지만 폭발했습니다. 이 작업을 보는 유일한 방법은has_many 입니다. 는 user단지 대부분의 일에있을 예정이다 profile.

나는 이것을 시도했다. 나는 가지고있다:

class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
end

그러나 내가 할 때 :

user.build_profile 

오류가 발생합니다.

ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4)  LIMIT 1

레일에 0 또는 1의 연관성을 갖는 방법이 있습니까?



답변

build메소드 서명은 다르다 has_onehas_many 협회.

class User < ActiveRecord::Base
  has_one :profile
  has_many :messages
end

에 대한 빌드 구문 has_many연관을 :

user.messages.build

에 대한 빌드 구문 has_one연관을 :

user.build_profile  # this will work

user.profile.build  # this will throw error

자세한 내용 은 has_one연결 설명서 를 읽으십시오 .


답변

오류 메시지를 잘보십시오. 프로파일 테이블user_id 에 필수 열이 없음을 알려 줍니다 . 모델의 관계 설정은 답의 일부일뿐입니다.

또한 user_id열을 프로파일 테이블에 추가하는 마이그레이션을 작성해야 합니다. Rails는 이것이있을 것으로 예상하고, 존재하지 않으면 프로파일에 액세스 할 수 없습니다.

자세한 내용은 다음 링크를 참조하십시오.

협회 기본


답변

유스 케이스에 따라 메소드를 랩하고 찾을 수 없을 때 자동으로 연관을 빌드하는 것이 편리 할 수 ​​있습니다.

old_profile = instance_method(:profile)
define_method(:profile) do
  old_profile.bind(self).call || build_profile
end

이제 #profile메소드를 호출하면 연관된 프로파일을 리턴하거나 새 인스턴스를 빌드합니다.

출처 :
원숭이가 메소드를 패치 할 때 새로운 구현에서 재정의 된 메소드를 호출 할 수 있습니까?


답변

이어야합니다 has_one. 경우 build작동하지 않습니다, 당신은 사용할 수 있습니다 new:

ModelName.new( :owner => @owner )

와 같다

@owner.model_names.build


답변