【问题标题】:How to retrieve information that is a join of tables in rails?如何检索作为rails中表连接的信息?
【发布时间】:2014-03-13 15:14:55
【问题描述】:

我的 rails 应用程序现在正在使用 ActiveRecord,我对 ruby​​ on rails 感到非常惊讶。 我的数据库有三个表:

学生(身份证、姓名、父母身份证) 父母(身份证,姓名) 成绩(Id,studentId,值)

还有三个模型。

我有三个视图,其中一个我必须列出学生,所以我创建了一个 Student.all 并且它可以工作。

但在其中一个视图中,我需要列出学生的家长姓名,而在第三个视图中,我需要列出学生的姓名和成绩。

我现在完全迷失了:如果我的模型是我的表,我如何检索这些表连接的信息?

谢谢

编辑: 我加了一行

Student.includes(:parent, :grades).all.each do |student|

并添加关系:

class Student < ActiveRecord::Base
  belongs_to :parent
end

class Parent < ActiveRecord::Base
  has_many :student
end

我在设置关系时遇到了一些问题,但现在我的页面加载了。我仍然不能使用 Student.parent.name 属性。 使用 我得到调试信息,但没有关于父级的信息。 (students.parent 显示 parent_id)

任何想法我错过了什么? 这是一个名称冲突:我的学生表有一个名为 parent 的列。更改为 parent_id 解决了它。

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    如果您的关系设置正确,您可以执行以下操作:

    Student.all.each do |student|
      puts student.name
      puts student.parent.name
      student.grades.each do |grade|
        puts grade.value
      end
    end
    

    【讨论】:

    • 太棒了,我简直不敢相信这行得通 :) 我今晚在家试试 :)
    【解决方案2】:

    您可能也有兴趣在这种情况下使用includes,以避免触发对您检索其成绩的每个学生的查询。在此示例中,您将替换:

    Student.all.each do |student|
    

    与

    Student.includes(:parent, :grades).all.each do |student|
    

    不同之处在于,在第一种情况下,Rails 会触发一个单独的查询来检索每个学生的成绩(以及一个查询来获取每个家长的姓名)。这通常被称为“N+1 问题”,因为如果您有 10 个学生,遍历每个学生并获取他们父母的姓名将需要 11 个查询(一个查询所有学生,一个查询每个学生的 10 个学生)得到他们父母的名字)。

    当您使用includes 时,Rails 会在一个查询中急切地加载所有关联的模型和属性。欲了解更多信息,请查看:

    http://guides.rubyonrails.org/active_record_querying.html

    【讨论】:

    • Rails 很棒 :) 我现在无法访问我的代码,今晚我会在家里做,然后回复你 :)
    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    相关资源
    最近更新 更多