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