복붙노트

[RUBY-ON-RAILS] 협회를 통해 belongs_to

RUBY-ON-RAILS

협회를 통해 belongs_to

다음 협회 감안할 때, 나는 선택이 선택 모델을 통해 연결되어 있는지 질문을 참조 할 필요가있다. 이 작업을 수행 할 답 :을 통해 질문 : 나는 belongs_to 사용하려고 시도하고있다.

class User
  has_many :questions
  has_many :choices
end

class Question
  belongs_to :user
  has_many :answers
  has_one :choice, :through => :answer
end

class Answer
  belongs_to :question
end

class Choice
  belongs_to :user
  belongs_to :answer
  belongs_to :question, :through => :answer

  validates_uniqueness_of :answer_id, :scope => [ :question_id, :user_id ]
end

나는 얻고있다

나는 current_user.choices을하려고 할 때

나는 포함되지 않은 경우는, 잘 작동

belongs_to :question, :through => :answer

그러나 나는 내가 validates_uniqueness_of을 할 수 있기를 원하기 때문에 것을 사용하려면

아마 뭔가 간단한을 내려다입니다. 어떤 도움을 주시면 감사하겠습니다.

해결법

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

    1.belongs_to 협회는있을 수 없습니다 : 옵션을 통해. 당신은 선택의 question_id를 캐싱 및 (validates_uniqueness_of는 경쟁 조건하는 경향이 특히 때문에) 테이블에 고유 인덱스를 추가하는 것이 더 낫다.

    belongs_to 협회는있을 수 없습니다 : 옵션을 통해. 당신은 선택의 question_id를 캐싱 및 (validates_uniqueness_of는 경쟁 조건하는 경향이 특히 때문에) 테이블에 고유 인덱스를 추가하는 것이 더 낫다.

    당신이있는 거 편집증 경우, 선택에 사용자 정의 유효성 검사를 추가하는 것을 확인 그 대답의 question_id 일치하지만, 최종 사용자가 불일치의이 종류를 만들 것 데이터를 제출할 수있는 기회를 제공해서는 안 것처럼 들린다.

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

    2.또한 위임 할 수 있습니다 :

    또한 위임 할 수 있습니다 :

    class Company < ActiveRecord::Base
      has_many :employees
      has_many :dogs, :through => :employees
    end
    
    class Employee < ActiveRescord::Base
      belongs_to :company
      has_many :dogs
    end
    
    class Dog < ActiveRecord::Base
      belongs_to :employee
    
      delegate :company, :to => :employee, :allow_nil => true
    end
    
  3. ==============================

    3.그냥 대신 belongs_to의 has_one를 사용을 통해, 다음과 같이 :

    그냥 대신 belongs_to의 has_one를 사용을 통해, 다음과 같이 :

    class Choice
      belongs_to :user
      belongs_to :answer
      has_one :question, :through => :answer
    end
    

    관련없는,하지만 난 당신의 데이터베이스에 적절한 고유 제한 조건을 사용하는 대신 validates_uniqueness_of 사용을 주저 할 것입니다. 이 루비에서 할 때 당신은 경쟁 조건을 가지고있다.

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

    4.내 방식 대신 데이터베이스 열을 추가하는 가상의 속성을 만드는 것이 었습니다.

    내 방식 대신 데이터베이스 열을 추가하는 가상의 속성을 만드는 것이 었습니다.

    class Choice
      belongs_to :user
      belongs_to :answer
    
      # ------- Helpers -------
      def question
        answer.question
      end
    
      # extra sugar
      def question_id
        answer.question_id
      end
    end
    

    이 방법은 매우 간단하지만, 트레이드 오프와 함께 제공됩니다. 그것은 DB, 다음 질문에서 답을로드 레일을 필요로한다. 이 열망 로딩 나중에 당신이 필요로하는 연결을 최적화 할 수 있습니다 (즉, C = Choice.first가 (포함 : {답 : 질문}))이 최적화가 필요한 경우, 그러나, 다음 stephencelis '대답은 아마 더 나은 성능의 결정이다.

    이 어떤 선택을위한 시간과 장소, 그리고 나는 프로토 타입 때 선택이 더 나은 생각합니다. 나는 그것이 자주 사용 사례에 대해 알고 있었다하지 않는 한 내가 생산 코드를 사용하지 않을 것입니다.

  5. ==============================

    5.당신이 원하는 것은 많은 질문이있는 사용자처럼 소리가 난다. 문제는 사용자의 선택 중 하나는 많은 답변이 있습니다.

    당신이 원하는 것은 많은 질문이있는 사용자처럼 소리가 난다. 문제는 사용자의 선택 중 하나는 많은 답변이 있습니다.

    이것은 당신이 후에 무엇인가?

    나는이 라인을 따라 뭔가 같은 모델 것입니다 :

    class User
      has_many :questions
    end
    
    class Question
      belongs_to :user
      has_many   :answers
      has_one    :choice, :class_name => "Answer"
    
      validates_inclusion_of :choice, :in => lambda { answers }
    end
    
    class Answer
      belongs_to :question
    end
    
  6. ==============================

    6.당신은 당신이 원하는 행동을 가지고 있지만 수 없습니다 그래서 당신은 그것을 같은 느낌이 뭔가를 할 수 있습니다. 당신은 Choice.first.question를 수행 할 수 있으려면

    당신은 당신이 원하는 행동을 가지고 있지만 수 없습니다 그래서 당신은 그것을 같은 느낌이 뭔가를 할 수 있습니다. 당신은 Choice.first.question를 수행 할 수 있으려면

    내가 과거에했던 것은이 같은 것입니다

    class Choice
      belongs_to :user
      belongs_to :answer
      validates_uniqueness_of :answer_id, :scope => [ :question_id, :user_id ]
      ...
      def question
        answer.question
      end
    end
    

    이 방법은 이제 선택에 질문을 호출 할 수 있습니다

  7. ==============================

    7.has_many : 선택은 협회라는 이름의 선택이 아닌 선택을 만듭니다. 대신 current_user.choices를 사용해보십시오.

    has_many : 선택은 협회라는 이름의 선택이 아닌 선택을 만듭니다. 대신 current_user.choices를 사용해보십시오.

    has_many 마법 약에 대한 자세한 내용은 액티브 :: 협회 설명서를 참조하십시오.

  8. from https://stackoverflow.com/questions/4021322/belongs-to-through-associations by cc-by-sa and MIT license