以多对多关系显示数据库中的数据

时间:2017-05-24 17:31:22

标签: ruby-on-rails many-to-many

所以我有两个名为Student and Classroom的课程。这是一个多对多的关系所以我的模型是

class Student< ApplicationRecord
  has_many :student_classrooms
  has_many :classrooms, :through => :student_classrooms
end

class Classroom< ApplicationRecord
  has_many :student_classrooms
  has_many :students, :through => :student_classrooms
end

class StudentClassroom< ApplicationRecord
  belongs_to :student
  belongs_to :classroom
end

我在学生中的控制器

class CoursesController < ApplicationController

  def new
    @student = Student.new    
  end

  def create
    @student = Student.new(course_params)
    if @student.save
      flash[:success] = "Student created!"
      redirect_to @student
    end
  end

  def show
    @student = Student.find(params[:id])
    @name = @student.name
    #@classroom = Classroom.find_by(name: @name) <--
  end
  ...

end

我的问题是如何获取学生的教室位置并将其存储到变量中,以便我能够在网页上显示。

2 个答案:

答案 0 :(得分:1)

使用:

  def show
    @student = Student.find(params[:id])
    @name = @student.name
    @classrooms = @student.classrooms
  end

这将为您提供一个ActiveRecord::Relation对象,您可以在其中进一步where语句。或者,您可以在视图中使用它来迭代并显示所有学生的课堂。

马克说得对,在你的show.html.erb你可以做类似的事情:

  <% @classrooms.each do |classroom| %>
    <%= classroom.name %>
  <% end %>

如果您想要的不仅仅是名称(例如教室编号),我建议使用_classroom.html.erb部分。您可以使用以下内容:

  <% @classrooms.each do |classroom| %>
    <%= render partial: 'classroom', locals: {classroom: classroom} %>
  <% end %>

我还建议花几分钟时间学习/转换为HAML。因此,您可以拥有一个看起来更像的show.html.haml文件:

  - @classrooms.each do |classroom|
    .classroom-container{id: classroom.id}
      = render partial: 'classroom', locals: {classroom: classroom}

或者,对于Mark的例子:

%ul
  - @classrooms.each do |classroom|
    %li 
      = classroom.name

不是更漂亮吗?而且,你可以省去所有麻烦的输入烦人的erb语法。而且不必记得关闭标签! HAML充满彩虹,闻起来像棉花糖!

答案 1 :(得分:0)

在你的show方法中:

def show
  @student = Student.find(params[:id])
  @name = @student.name
  @classrooms = @student.classrooms
end

然后在您的app/views/students/show.html.erb文件中,您可以执行以下操作:

<ul>
  <% @classrooms.each do |classroom| %>
    <li><%= classroom.name %></li>
  <% end %>
</ul>

这会将您正在查看的学生的所有课堂名称打印为无序列表。