2

我正在研究Rails應用程序,目前我有2個模型 - 主題和課程。 一個學科有三種不同類型的課程 - 講座,教程和實驗室。我建模的模型有3個has_one。Rails與同一模型的多個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個具有指示課程類型的默認字段的表單提供一些建議。

回答

4

我真的不知道,如果這樣的作品,但我的建議是使用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 

它更有意義,它可以修復你嵌套發行屬性

+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