Ruby on Rails - 如何连接两个表?

2024-03-23

我有两个处于一对多关系的表(主题和页面)。我想添加主题和页面的条件来解析 sql,但进展非常缓慢,并且经常遇到问题。我是 Rails 的新手,请帮忙。

class Subject < ActiveRecord::Base
  has_many :pages
end

class Page < ActiveRecord::Base
  belongs_to :subject 
end

受试者中的样本数据,列出以下三列:

id  name    level
1   'Math'  1
6   'Math'  2
...

页中的示例数据,下面列出了列:

id  name                    subject_id
--  --------------------    ----------
2   Addition                1
4   Subtraction             1
5   Simple Multiplication   6
6   Simple Division         6
7   Hard Multiplication     6
8   Hard Division           6
9   Elementary Divsion      1

鉴于我不知道 subject.id,我只知道主题名称和级别以及页面名称。这是我想要生成的 sql(或类似的东西,可以达到相同的结果):

select subjects.id, subjects.name, pages.id, pages.name from subjects, pages
 where subjects.id = pages.subject_id
   and subjects.name = 'Math'
   and subjects.level = '2'
   and pages.name like '%Division'  ;

我希望在结果中得到两行:

subjects.id     subjects.name   pages.id    pages.name 
-----------     -------------   --------    -----------
6               Math            6           Simple Division
6               Math            8           Hard Division

这是一个非常简单的sql,但我一直无法在rails中得到我想要的。

Here is my rails console:  

>> subject = Subject.where(:name => 'Math', :level => 2)
  Subject Load (0.4ms)  SELECT `subjects`.* FROM `subjects` WHERE `subjects`.`name` = 'Math' AND `subjects`.`level` = 2
[#<Subject id: 6, name: "Math", position: 1, visible: true, created_at: "2011-12-17 04:25:54", updated_at: "2011-12-17 04:25:54", level: 2>]
>> 
>> subject.joins(:pages).where(['pages.name LIKE ?', '%Division'])
  Subject Load (4.2ms)  SELECT `subjects`.* FROM `subjects` INNER JOIN `pages` ON `pages`.`subject_id` = `subjects`.`id` WHERE `subjects`.`name` = 'Math' AND `subjects`.`level` = 2 AND (pages.name LIKE '%Division')
[#<Subject id: 6, name: "Math", position: 1, visible: true, created_at: "2011-12-17 04:25:54", updated_at: "2011-12-17 04:25:54", level: 2>, #<Subject id: 6, name: "Math", position: 1, visible: true, created_at: "2011-12-17 04:25:54", updated_at: "2011-12-17 04:25:54", level: 2>]
>> 
>> subject.to_sql
"SELECT `subjects`.* FROM `subjects`  WHERE `subjects`.`name` = 'Math' AND `subjects`.`level` = 2"
>> subject.size
1
>> subject.class
ActiveRecord::Relation

第一条语句: subject = subject.where(:name => 'Math', :level => 2) 第二条语句: subject.joins(:pages).where(['pages.name LIKE ?', '%Division'])

问题:

  1. 链接sql的结果确实返回两​​行,但subject.size只说1?
  2. 我如何告诉它也从 :pages 返回列?
  3. 为什么 subject.to_sql 仍然只显示语句 1 中的 sql,为什么它不包含语句 2 中的链式 sql?
  4. 本质上,我需要以不同的方式编写语句来解析上面列出的 sql(或实现相同的结果)?

非常感谢。


1) ActiveRecord 会将您的查询结果映射到objects不是任意返回的行,所以因为您基于查询创建Subject类它正在查看您的结果行并发现它仅引用 1 个唯一的Subject对象,因此仅返回该单个Subject实例。

2) 列数据在那里,但是您正在根据 ActiveRecord 想要给您的内容进行工作,即对象。如果您希望返回页面,那么您需要将查询的创建基于Page class.

3)您没有保存添加结果join(:pages)...回到subject多变的。如果你这样做:

subject = subject.joins(:pages).where(['pages.name LIKE ?', '%Division'])

运行时您将获得完整的查询subject.to_sql

4)要获取页面对象,您可以执行类似的操作,请注意,我们将其基于Page class:

pages = Page.joins(:subject).where(['subjects.name = ? AND subjects.level = ? AND pages.name LIKE ?', 'Math', 2, '%Division'])

然后首先从那里访问主题名称Page返回的对象:

pages[0].subject.name

因为您在第一个中进行了连接,所以不会导致另一个 SQL 查询。希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby on Rails - 如何连接两个表? 的相关文章

  • Michael Hartl 的 Ruby on Rails 教程。第 9 章测试失败

    我是一名正在学习 Michael Hartl Ruby on Rails 教程的新手 在第 9 章的测试中有几个失败的项目 运行 RSPEC 测试返回 sis macbook pro sample app Lagaspi bundle ex
  • Rails form_for 选择已选择选项的标签

    我正在使用 form for 来更新用户个人资料 作为表单的一部分 我使用选择菜单 菜单由数组填充 即 STATUS Active active In Active inactive 然后在表格中 虽然这项工作没有选择之前在编辑时选择的选项
  • Active Admin:如何设置页面标题?

    这看起来应该相对简单 但我在寻找答案时遇到了一些麻烦 如何在 ActiveAdmin 中设置页面标题 合并答案并添加一点 这大部分都在维基百科上的这个页面 https github com gregbell active admin wik
  • 是否有用于修改 Rails 3 的 I18n 语言环境的 Web UI?

    我正在寻找一种方法来通过 web gui 修改语言环境的 I18n yml 文件的值 是否有一些 gem 可以实现这一点 模仿 Twitter 翻译中心的 gemgithub com badrit translation center ht
  • Rails:计划任务来预热缓存?

    我使用以下内容通过 memcached 缓存加载缓慢的页面 caches action complex report expires in gt 1 day 控制器操作受 Devise 身份验证保护 当前 该页面在用户第一次请求时被缓存 当
  • 切换到 zsh 会破坏命令行中的轨道

    我最近刚刚转而使用 zsh 和 oh my zsh 但在使用 Rails 命令行工具时遇到了问题 以下是我执行的步骤以及收到的错误 我运行了github页面提供的curl命令 curl L https github com robbyrus
  • 使用带有部分模板文件的 i18n gem 时出现问题

    我正在使用 Ruby on Rails 3 1 我想知道如何正确处理与部分模板文件相关的国际化 那是 在我的app views users flag html erb我有的文件 在我的app views users flag form ht
  • 如何将 ActionController::Live 与 Resque + Redis 一起使用(用于聊天应用程序)

    我正在尝试为我的 Rails 应用程序构建聊天功能 我在用ActionController Live Puma Resque Redis为了这 所以基本上在这种情况下 redissubscribe方法正在后台运行 使用resque 到目前为
  • 帮助加入 Rails 3

    我有以下型号 class Event lt ActiveRecord Base has many action items end class ActionItem lt ActiveRecord Base belongs to event
  • 将自连接重写为 JPQL

    我需要将此自连接转换为 JPQL SELECT s1 FROM site AS s1 JOIN SELECT site type MAX last update date AS LastUpdate FROM site WHERE site
  • PHP 内部的连接分解

    我看到一篇关于连接分解的文章 场景 1 不好 Select from tag Join tag post ON tag post tag id tag id Join post ON tag post post id post id Whe
  • Ruby On Rails 助手——在助手中使用实例变量

    我有一个控制器助手 module CourseStepsHelper def current quiz result course step step step quiz quiz attempts where patient id gt
  • ruby on Rails 中的自动测试错误

    我运行了命令自动测试 这是我得到的错误 我正在关注 Hartl 的书 想知道这种冲突是否会发生 因为 Rails 现在附带了 ZenTest 还是其他东西 我怎样才能克服这个错误 我是 RoR 新手 Invalid gemspec in U
  • 为 Rails 3 应用程序制作自定义插件/gem/引擎

    我正在遵循指南http edgeguides rubyonrails org plugins html http edgeguides rubyonrails org plugins html而且它似乎有点过时了 您能看一下并告诉我哪些部分
  • 如何使用 RSpec 测试 Rails 中的包含验证

    我的 ActiveRecord 中有以下验证 validates active inclusion gt in gt Y N 我正在使用以下内容来测试我的模型验证 should not allow value A for active sh
  • 验证远程图像实际上是 ruby​​ 中的图像文件?

    我试图弄清楚如何验证我输入载波的内容实际上是图像 我获取图像网址的来源并没有返回所有实时网址 有些图像已不复存在 不幸的是 它并没有真正返回正确的状态代码或任何内容 因为我正在使用一些代码来检查远程文件是否存在并且它通过了该检查 因此 现在
  • 为什么多表连接会产生重复行?

    假设我有三个表 A B 和 C 每个表都有两列 一个主键和一些其他数据 它们每个都有相同的行数 如果我JOIN主键上的 A 和 B 我最终应该得到与其中任何一个相同的行数 而不是 A rows B rows 现在 如果我JOIN A JOI
  • 如何用载波发送文件给用户?

    这是我将文件发送到浏览器的旧代码 def show send file File join Rails root tmp price xls end 但最近我发现 tmp 文件夹不能用作 Heroku 上的持久存储 因此我决定将文件移动到
  • 如何在 Rails 3 中并行使用 Mongoid 和 ActiveRecord?

    我使用的是 Rails 3 并使用 ActiveRecord 开始我的应用程序 现在 我有很多模型 并且关系开始变得复杂 有些可以用面向文档的结构更简单地表达 所以我想尝试迁移到 MongoDB 并使用 Mongoid 我一直听说您不必使用
  • Rails 3:# 的未定义方法“page”

    我无法克服这一点 我知道我读过没有数组的页面方法 但我该怎么办 如果我在控制台中运行 Class all 它会返回 但如果我运行 Class all page 1 则会收到上述错误 有任何想法吗 没有数组没有页面方法 看起来你正在使用kam

随机推荐