如何在一列中的多个表中显示多个表的数据

问题描述:

我有两个表 - 报表和主题。如何在Rails中查询和显示一行中的两个表中的数据?如何在一列中的多个表中显示多个表的数据

这里有关系:

class Subject < ActiveRecord::Base 
has_many :term_reports 
end 

class TermReport < ActiveRecord::Base 
belongs_to :subject 
end 

这里的模式:

create_table "subjects", force: true do |t| 
t.string "name" 
t.integer "user_id" 
t.date "createdate" 
end 

create_table "term_reports", force: true do |t| 
t.string "student_studentid" 
t.integer "subject_id" 
t.integer "score" 
t.integer "position" 
t.integer "term" 
t.integer "year" 
t.integer "user_id" 
t.date "ceatedate" 
t.string "remark" 
t.string "form_class" 
end 

现在我想要的数据是这样的格式:

Sujectname score position etc.. 

注意,主题名称为存储在Sujects表中。从一个表,如果我使用的find_by_sql

@student_subject = TermReport.includes(:subject).all 
@student_subject = TermReport.joins(:subject).all 

然而,这条SQL运行良好的工作平台,但显示的数据: 的bolow代码只从一个表中生成数据。帮助

select * from term_reports t, subjects s 
where t.subject_id = s.id 
+0

你覆盖'和'TermReport.joins' TermReport.includes'。 –

谢谢Smek。这里是我的控制器操作:

def search_student_results 
    @student_subject = TermReport.where("student_studentid =? and year =? and term =? and form_class =?", 
          params[:studentid], params[:year], params[:term], params[:formclass]) 
    respond_to do |format| 
    format.js {render json: @student_subject} 
    end 
end 

这里是我的Ajax调用:

$(function() { 
$('#subject_search_btn').click(function() { 
    var student_id = $('#search').val(); 
    var year = $('#year').val(); 
    var term = $('#term').val(); 
    var classs = $('#formclass').val(); 

    $.ajax({ 
     "url": "/search_student_results", 
     "data": {"studentid":student_id, "year":year, "term":term, "formclass":classs}, 
     "type": "get", 
     "dataType": "json", 
     "success": function(data) { 
      var trHTML = ''; 
      $.each(data, function (i, item) { 
       trHTML += '<tr>' + 
        '<td>' + item.subject_id + '</td>' + 
        '<td>' + item.score + '</td>' + 
        '<td>' + item.position + '</td>' + 
        '<td>' + item.remark + '</td>' + 
        '</tr>'; 
      }); 
      $('#subject_tbody').append(trHTML); 
     }, 
     "error": function() { 
      alert('Student not found'); 
     } 
    }); 
}); 
}); 

如何我item.subject.name取代item.subject_id? 谢谢

+0

首先,当你想从控制器中检索json时,你应该在你的respond_to块中使用format.json。你可以通过覆盖as_json来修改json响应:http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json – Smek

+0

我想没有问一个完全不同的问题。如何在每次点击按钮时清除上述ajax调用?实际上,当我更改参数并单击搜索时,加载新结果加上旧结果。 –

这应该只是罚款,你可以尝试一下您的控制台上:

TermReport.includes(:subject).all.each do |term| 
    puts "#{term.subject.name} #{term.score} #{term.position}" 
end 

而且TermReport.all足够,我不认为你需要包括(:主题)。

所以要回答你的最后一个问题。

您可以更改:

format.js {render json: @student_subject} 

有了:

format.json do 
    render json: @student_subject.as_json(include: { subject: { only: :name } }) 
end 
+0

工程像魔术。谢谢 –

+0

很高兴解决了这个问题。你介意接受这个答案吗?它可能会帮助人们遇到类似问题,并帮助您发现问题。有关更多 信息,请查看我们的[常见问题](https://stackoverflow.com/help/accepted-answer)。谢谢,欢迎来到SO! – Smek