[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.belongs_to 협회는있을 수 없습니다 : 옵션을 통해. 당신은 선택의 question_id를 캐싱 및 (validates_uniqueness_of는 경쟁 조건하는 경향이 특히 때문에) 테이블에 고유 인덱스를 추가하는 것이 더 낫다.
belongs_to 협회는있을 수 없습니다 : 옵션을 통해. 당신은 선택의 question_id를 캐싱 및 (validates_uniqueness_of는 경쟁 조건하는 경향이 특히 때문에) 테이블에 고유 인덱스를 추가하는 것이 더 낫다.
당신이있는 거 편집증 경우, 선택에 사용자 정의 유효성 검사를 추가하는 것을 확인 그 대답의 question_id 일치하지만, 최종 사용자가 불일치의이 종류를 만들 것 데이터를 제출할 수있는 기회를 제공해서는 안 것처럼 들린다.
-
==============================
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.그냥 대신 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.내 방식 대신 데이터베이스 열을 추가하는 가상의 속성을 만드는 것이 었습니다.
내 방식 대신 데이터베이스 열을 추가하는 가상의 속성을 만드는 것이 었습니다.
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.당신이 원하는 것은 많은 질문이있는 사용자처럼 소리가 난다. 문제는 사용자의 선택 중 하나는 많은 답변이 있습니다.
당신이 원하는 것은 많은 질문이있는 사용자처럼 소리가 난다. 문제는 사용자의 선택 중 하나는 많은 답변이 있습니다.
이것은 당신이 후에 무엇인가?
나는이 라인을 따라 뭔가 같은 모델 것입니다 :
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.당신은 당신이 원하는 행동을 가지고 있지만 수 없습니다 그래서 당신은 그것을 같은 느낌이 뭔가를 할 수 있습니다. 당신은 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.has_many : 선택은 협회라는 이름의 선택이 아닌 선택을 만듭니다. 대신 current_user.choices를 사용해보십시오.
has_many : 선택은 협회라는 이름의 선택이 아닌 선택을 만듭니다. 대신 current_user.choices를 사용해보십시오.
has_many 마법 약에 대한 자세한 내용은 액티브 :: 협회 설명서를 참조하십시오.
from https://stackoverflow.com/questions/4021322/belongs-to-through-associations by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] has_many에 레코드를 추가하는 방법 : 레일에 협회를 통해 (0) | 2020.02.21 |
---|---|
[RUBY-ON-RAILS] 선택 도우미 난간 - 기본 방법, 값을 선택? (0) | 2020.02.21 |
[RUBY-ON-RAILS] turbolinks와 AngularJS와 사용 (0) | 2020.02.21 |
[RUBY-ON-RAILS] 3 마이그레이션 레일 : 참조 열을 추가? (0) | 2020.02.21 |
[RUBY-ON-RAILS] 어떻게 JSON에 루비 해시 객체를 변환하는? (0) | 2020.02.21 |