2

레일즈 애플리케이션을 개발 중이고 현재 2 개의 모델 (과목 및 레슨)이 있습니다. 과목에는 강의, 튜토리얼 및 실험실이라는 3 가지 유형의 강의가 있습니다. 나는 레슨 모델에 has_one이 3 개 있도록 모델링했다.Rails multiple has_one 동일한 모델과의 관계

지금은 과목과 수업을 위해 중첩 된 양식을 만들려고하고 있지만 강의, 자습서 및 실험실을 저장하는 것은 항상 렌더링 된 첫 번째 형식이었습니다. 즉 강의, 튜토리얼 및 실험실에 대해 3 개의 중첩 된 양식을 별도로 보유하고 있지만 저장 된 강의, 자습서 및 실험실은 항상 처음 만들어진 것입니다. 제 코드에서는 강좌가 처음 작성되어 강습을 위해 입력 한 튜토리얼과 실험실의 특성을 따르게되었습니다.

내가 잘못 갔는지, 아니면 여러 개의 has_one 관계가이 경우에 작동하더라도 확실하지 않으므로 조언을 주시면 감사하겠습니다. 다음과 같이

관련 코드

은 다음과 같습니다

제목 모델

class Subject < ActiveRecord::Base 

    has_one :lecture, :class_name => "Lesson" 
    has_one :laboratory,:class_name => "Lesson" 
    has_one :tutorial, :class_name => "Lesson" 

    accepts_nested_attributes_for :lecture 
    accepts_nested_attributes_for :laboratory 
    accepts_nested_attributes_for :tutorial 

end 

수업 모델

class Lesson < ActiveRecord::Base 
    belongs_to :subject 
end 

피사체와 교훈 중첩 된 형태

<%= form_for(@subject_list) do |f| %> 
    <div class="field"> 
    <%= f.label :subject_code %><br /> 
    <%= f.text_field :subject_code %> 
    </div> 
    <div> 
    <%= f.fields_for :lecture do |lecture| %> 
     <%= render "lecture_fields", :f => lecture %> 
    <% end %> 
    </div> 
    <div> 
    <%= f.fields_for :tutorial do |tutorial| %> 
     <%= render "tutorial_fields", :f => tutorial %> 
    <% end %> 
    </div> 
    <div> 
    <%= f.fields_for :laboratory do |laboratory| %> 
     <%= render "laboratory_fields", :f => laboratory %> 
    <% end %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

새를 주제 컨트롤러의 동작

def new 
    @subject = Subject.new 

    lecture = @subject.build_lecture 
    laboratory = @subject.build_laboratory 
    tutorial = @subject.build_tutorial 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @subject } 
    end 
    end 

누군가 내가 잘못 갔는지 식별하는 데 도움이된다면 감사하겠습니다. 그러한 다중 관계를 만들지 않아야하는 경우, 실제로 레슨 유형을 나타내는 기본 필드가있는 3 개의 양식을 렌더링 할 수있는 방법에 대한 조언이 필요합니다. 그 작동하지만, 내 조언은 AR 상속을

class Lesson < ActiveRecord::Base 
end 

class LectureLesson < Lesson 
    belongs_to :subject 
end 

class LaboratyLesson < Lesson 
    belongs_to :subject 
end 

class TutorialLesson < Lesson 
    belongs_to :subject 
end 

class Subject 
    has_one :lecture_lesson 
    has_one :laboratory_lesson 
    has_one :tutorial_lesson 

    accepts_nested_attributes_for :lecture_lesson 
    accepts_nested_attributes_for :laboratory_lesson 
    accepts_nested_attributes_for :tutorial_lesson 
end 

을 사용하여 마이그레이션

class LessonsAndSubjects < ActiveRecord::Migration 
    def up 
    remove_column :subjects, :lesson_id 

    add_column :subjects, :lecture_lesson_id, :integer 
    add_column :subjects, :laboratory_lesson_id, :integer 
    add_column :subjects, :tutorial_lesson_id, :integer 

    add_column :lessons, :type, :string 

    add_index :subjects, :lecture_lesson_id 
    add_index :subjects, :laboratory_lesson_id 
    add_index :subjects, :tutorial_lesson_id 
    end 

    def down 
    remove_column :subjects, :lecture_lesson_id 
    remove_column :subjects, :laboratory_lesson_id 
    remove_column :subjects, :tutorial_lesson_id 

    remove_column :lessons, :type 

    add_column :subjects, :lesson_id, :integer 
    end 
end 

이 더 의미하고 당신이 중첩으로 발급 해결 할 수있는 경우

답변

4

는 정말 모르겠어요 속성

+1

매우 도움이 추가 다음 있습니다. 내 앱에서 외래 키 선언이 누락되었습니다. –

0

실제로는 rorra의 답변에서 한 점이 누락되었습니다. 쿼리 문제가 발생하지 않도록 각 "하위"에 대한 다형성 연관을 추가해야합니다.

마이그레이션
class Lesson < ActiveRecord::Base 
    belongs_to :subject 
end 

class LectureLesson < Lesson 
    belongs_to :polymorphic_lecture_lesson, polymorphic: true 
end 

class Subject 
    has_one :lesson 
    has_one :lecture_lesson, as: :polymorphic_lecture_lesson 

    accepts_nested_attributes_for :lesson 
    accepts_nested_attributes_for :lecture_lesson 
end 

당신은

add_column :lessons, :polymorphic_lecture_lesson_id, :integer, index: true 
add_column :lessons, :polymorphic_lecture_lesson_type, :integer, index: true 
관련 문제