이 예에서는 user
no 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_one
및has_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
답변
