gpt4 book ai didi

ruby-on-rails - Rails 与同一模型的多个 Has_one 关系

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:58 25 4
gpt4 key购买 nike

我正在开发 Rails 应用程序,目前我有 2 个模型 - 主题和类(class)。一个主题有 3 种不同类型的类(class) - 讲座、教程和实验室。我建模使得 Lesson 模型有 3 个 has_one。

现在,我正在尝试为主题和类(class)创建一个嵌套表单,但保存的讲座、教程和实验室始终是第一个呈现的表单。即我分别为 Lecture、Tutorial 和 Laboratory 设置了 3 个嵌套表格,但保存的 Lecture、Tutorial 和 Laboratory 始终是第一个构建的表格。在我的代码中,讲座首先构建,因此教程和实验室的属性将遵循我为讲座填写的属性。

我不确定我哪里出错了,或者即使在这种情况下有多个 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)模型

class Lesson < ActiveRecord::Base
belongs_to :subject
end

主题和类(class)嵌套形式

<%= 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 %>

主题 Controller 中的新 Action

    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 个表单以及指示类(class)类型的默认字段提出一些建议。

最佳答案

我不确定这是否可行,但我的建议是使用 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

它更有意义,它可能会解决嵌套属性的问题

关于ruby-on-rails - Rails 与同一模型的多个 Has_one 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14414910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com