복붙노트

[RUBY-ON-RAILS] 레일에 has_one 협회와 빌드를 사용하여

RUBY-ON-RAILS

레일에 has_one 협회와 빌드를 사용하여

이러한 예에서, I 나중에 후, 아니 프로필과 사용자를 생성하는 사용자에 대한 프로파일을 생성한다. 나는 has_one 협회와 빌드를 사용하여 시도하지만 폭발. 나는이 작업을 볼 수있는 유일한 방법은 has_many을 사용하고 있습니다. 사용자는 단지 가장 한 프로필을 가질 예정이다.

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

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 연관을 가지고 레일 방법이 있나요?

해결법

  1. ==============================

    1.빌드 방법 서명은 has_one 및 has_many 협회 다릅니다.

    빌드 방법 서명은 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 협회 설명서를 참조하십시오.

  2. ==============================

    2.오류 메시지에서 좋은 모습을보십시오. 당신이 프로필 테이블에 열 USER_ID를 요구하지 않는 사실을 말하고있다. 모델의 관계를 설정하면 답의 일부입니다.

    오류 메시지에서 좋은 모습을보십시오. 당신이 프로필 테이블에 열 USER_ID를 요구하지 않는 사실을 말하고있다. 모델의 관계를 설정하면 답의 일부입니다.

    또한 프로파일 테이블에 USER_ID 컬럼을 추가하는 마이그레이션을 작성해야합니다. 레일이있을 것으로 예상하고 그렇지 않은 경우에는 프로파일에 액세스 할 수 없습니다.

    자세한 내용은이 링크에서 봐 주시기 바랍니다 :

    협회 기본 사항

  3. ==============================

    3.유스 케이스에 따라, 방법을 포장하고 자동으로 찾을 수없는 경우 연관을 만들 때 편리 할 수 ​​있습니다.

    유스 케이스에 따라, 방법을 포장하고 자동으로 찾을 수없는 경우 연관을 만들 때 편리 할 수 ​​있습니다.

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

    이제 #profile 메소드를 호출하는 중 관련 프로필을 반환하거나 새로운 인스턴스를 구축합니다.

    출처: 원숭이 방법을 패치 할 때, 당신은 새로운 구현에서 재정의 된 메서드를 호출 할 수 있습니다?

  4. ==============================

    4.그것은 has_one해야한다. 빌드가 작동하지 않는 경우, 당신은 단지 새로운 사용할 수 있습니다 :

    그것은 has_one해야한다. 빌드가 작동하지 않는 경우, 당신은 단지 새로운 사용할 수 있습니다 :

    ModelName.new( :owner => @owner )
    

    와 같다

    @owner.model_names.build
    
  5. from https://stackoverflow.com/questions/2472982/using-build-with-a-has-one-association-in-rails by cc-by-sa and MIT license