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

时间:2017-10-18 09:37:15

标签: mysql ruby-on-rails

我有两张桌子 - 报告和主题。如何在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..

请注意,主题名称存储在“项目”表中。 bolow代码仅从一个表生成数据:

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

但是,这个sql在Workbench中工作得很好,但是如果我使用find_by_sql则显示来自一个表的数据。帮助

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

3 个答案:

答案 0 :(得分:1)

这应该可以正常工作,你可以在你的控制台上试试:

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

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

答案 1 :(得分:0)

谢谢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_id替换为item.subject.name? 感谢

答案 2 :(得分:0)

所以回答你的上一个问题。

您可以更改:

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

使用:

{{1}}