【问题标题】:ActiveRecords joins - order between belongs_to and has manyActiveRecord joins - belongs_to 之间的顺序并且有很多
【发布时间】:2015-02-14 16:38:28
【问题描述】:

这似乎是一个简单的问题,但我已经寻找了一段时间并没有找到答案......

我有三个模型:

class Room < ActiveRecord::Base
  has_many :classes
end

class Classe < ActiveRecord::Base
  belongs_to :teachers
  belongs_to :rooms
end

class Teacher < ActiveRecord::Base
  has_many :classes
end

根据老师的姓名,我想获取他的所有课程以及与每个课程相关联的房间。我尝试了joinsincludes 的查询组合,但无法正确...

另外,Teacher.joins(:classes) 有效但Classe.joins(:teachers) 无效的原因是什么?

【问题讨论】:

  • 我认为你有一个错字:应该是belongs_to :teacher(单数),而不是teachers。此外,我很惊讶 Rails 正确地将“Classes”单数化为“Classe”。那不应该是“类”吗?
  • 您希望在哪种情况下获得教师的课程和相关房间,即您希望如何/在哪里使用它们?我问是因为您实际上不必在这里使用includes - 这只是一个可选的性能优化,joins 也不适用。只需Teacher.find(5).classes 为您提供老师 5 的所有课程,Teacher.find(5).classes.first.room 将为您提供这些课程中的第一堂课。
  • 感谢 janfoeh,我已经修正了错别字(我根据我的问题改编了这个例子,以便更容易理解,所以我不太了解单数化 :))
  • 我想为与我的老师姓名对应的所有条目返回一个 {teacher_id, classe_id, room_id} 列表。 Teacher.find(5).classes.all.room 之类的东西(显然不起作用)
  • 所以你想制作一个包含这三个值的自定义哈希?

标签: ruby-on-rails join activerecord


【解决方案1】:

为了建立一个列表如

[
 {teacher_id: 5, class_id: 9, room_id: 3},
 {teacher_id: 5, class_id: 10, room_id: 2},
 ...
]

对于单身老师,试试

Teacher.find(5).classes.map do |klass|
  {
    teacher_id: klass.teacher_id,
    class_id: klass.id,
    room_id: klass.room_id
  }
end

(我在这里使用klass,因为class 是Ruby 中的保留字)。

【讨论】:

    【解决方案2】:

    你可以在这个页面找到你的答案:

    RailsGuides: Active Record Query Interface

    Teacher.where(name: "Joe").joins(:classes).joins(:rooms)
    

    【讨论】:

    • 请不要只发布一个链接,而是provide some context围绕它。
    • 返回 ActiveRecord::ConfigurationError: Association named 'rooms' was not found on Teacher; perhaps you misspelled it? 是的,我已经阅读了 Rails 指南。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    相关资源
    最近更新 更多