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 - 如何连接两个表? 的相关文章

  • Ruby on Rails(三)隐藏部分视图

    我正在开发 Ruby on Rails 3 Web 应用程序 我有一个名为User有一列名为role 我正在寻找对视图的这些部分具有 错误 角色的用户隐藏视图部分的最佳方法 例如我希望所有用户都能够看到用户index页面 但我只想要具有角色
  • MySQL 连接最新行

    我有两张桌子agents and calls 座席将始终处于一个活动呼叫中 可能有另一个待处理的呼叫分配给某个座席 而该座席尚未应答 我想编写一个查询来测试最新的调用是否按排序dateCreated与代理表中当前活动的呼叫匹配 以下是当前呼
  • Rails 轮胎 Elasticsearch 奇怪的错误

    我已经索引了Car拥有一辆车记录的车型mercedes benz在数据库中 如果我搜索这个词benz我收到错误 ActiveRecord RecordNotFound in CarsController index Couldn t fin
  • 设计对多个并发会话的支持

    我使用 Rails 3 2 11 和 Devise 2 2 3 作为订阅服务应用程序 我从另一位不再可用的开发人员那里继承了该应用程序 我是 Rails 和 Devise 的新手 我想要允许单个用户 电子邮件 拥有多个会话到同一个应用程序
  • Ruby on Rails 中的渲染验证错误

    在模型中说Task 我有以下验证 validates presence of subject project user status 如何使用其他控制器呈现这些验证的错误消息 在我使用的 CustomController 内部 Task c
  • PostgreSQL 字符串(255)限制 - Rails、Ruby 和 Heroku

    所以我有一个comments表的结构如下 Schema Information Table name comments id integer not null primary key body string 255 notified boo
  • 在Ruby On Rails中通过jquery的onclick函数传递对象的id

    我有一个控制器VendorController 查看文件是index html erb 我想通过 onclick 函数传递供应商的 id 这是我的代码 下的代码vendors controller rb def index vendor V
  • Symfony 2 中的连接表

    我刚刚开始在 Symfony 2 中进行面向对象编程 并且在连接 mysql 表时遇到问题 我有两张桌子 kommuner id 名称 容量 活动 id 姓名 kommune id 如何在实体文件中加入这些表 这是我在 DefaultCon
  • solr JOIN 查询

    我需要在 solr 索引上运行 JOIN 查询 我有两个已索引的 xml person xml 和 subject xml Person
  • Rails 路由:仅具有自定义操作的资源

    我有一个NotificationsController 其中我只有动作clear 我想通过执行 POST notifications clear 来访问此操作 所以我在我的路由器中写了这个 resources notifications o
  • SQLite:具有四个表的完全外连接

    编辑 可以找到这个问题的扩展here https stackoverflow com questions 47667304 sqlite full outer join with four tables with 30 columns 我想
  • MySQL JOIN 的评估顺序是什么?

    我有以下查询 SELECT c FROM companies AS c JOIN users AS u USING companyid JOIN jobs AS j USING userid JOIN useraccounts AS us
  • 设计不能很好地处理 RoR3 应用程序上的多个子域

    我看到了很多关于这个主题的问题 但其中很多都有相互矛盾的信息 并且由于某种原因它对我不起作用 I have 顶级域名 即 lvh me 开发 每个用户都有子域 即 userdomain lvh me 登录表单位于顶级域 lvh me I w
  • 使用 MySQL:使用 Inner Join 更新字段的值

    我有一个主表和一个索引表 两个表共享一个称为 L Status 的公共主字段 我想根据索引表中名为 status 的引用将主表中的数据从 L Status 值 整数 更新为 L StatusLV 可读文本值 以下是我在 PHPmyAdmin
  • Rails 3.0.0.beta 和 Facebooker:还有其他人看到以下内容吗?

    我的 Rails 服务器在安装 facebooker 插件后似乎崩溃了 任何有关解决此问题的建议都会很棒 我正在使用 Rails 3 0 0 beta 和 facebooker 以下是我看到的步骤和错误 rails v Rails 3 0
  • 如何连接行并添加分隔符?

    命令J连接线 命令gJ连接线删除空格 是否还有连接行的命令 在行之间添加分隔符 Example Input text other text more text text 我想做的事 选择这4行 如果开始和 或 EOL 处有空格 请将其删除
  • Codeigniter 加入多个条件

    我正在使用 Codeigniter Active Records 课程 我想加入我的users与我的桌子clients表 这样我就可以显示用户的 真实 姓名 而不仅仅是他们的 ID 这是什么clients表看起来像 示例 列 a 1 a 2
  • Ruby on Rails content_for 会自动进行 HTML 转义吗?

    使用 Rails 3 0 6 我发现在视图中 如果我执行 content for food name Macaroni Cheese 然后当我使用它回来时content for food name 那么 将被制作成 amp 已经 如果我做一
  • Rails:关于产量

    我在a中看到了一些代码导轨 v2 3 app In layout car general html erb 这个视图是由 cars controller 中的方法调用的 我看到了代码 var some car new Object 有两个问
  • Ruby on Rails 3 - 为每个请求重新加载 lib 目录

    我正在为 Rails 3 应用程序创建一个新引擎 正如您所猜测的 该引擎位于我的应用程序的 lib 目录中 但是 我在开发它时遇到了一些问题 事实上 每次更改引擎中的某些内容时 我都需要重新启动服务器 有办法避免这种情况吗 我可以强制rai

随机推荐