当前位置: 首页 > 面试题库 >

Rails中的高级SQL

陶山
2023-03-14
问题内容

我有2个型号

class User < AR
 has_many :friends
end

class Friend < AR
  # has a name column
end

我需要找到所有与“ Joe”和“ Jack”同时为好友的用户

任何想法我怎么能做到这一点?


问题答案:

一种选择是将每个名称作为各个INNER JOINS的参数。在SQL中将是这样的:

SELECT users.* FROM users
INNER JOIN friends AS f1 
    ON users.id = f1.user_id 
    AND f1.name = 'Joe'
INNER JOIN friends AS f2 
    ON users.id = f2.user_id 
    AND f2.name = 'Jack'

由于它是INNER JOINS,因此将仅显示可以同时使用f1和f2联接users表的结果。

并在Rails中使用它,也许可以这样做:

class User < AR
  has_many :friends

  def self.who_knows(*friend_names)
    joins((1..friend_names.length).map{ |n| 
      "INNER JOIN friends AS f#{n} ON users.id = f#{n}.user_id AND f#{n}.name = ?" }.join(" "),
      *friend_names)
    })
  end
end

然后可以这样调用

@users = User.who_knows("Joe", "Jack")


 类似资料:
  • Ruby、Rails 高级技巧 ActiveJob / 异步队列 Sidekiq 精通 36 分钟 Rails 4.2 中 ActiveJob 的使用 Sidekiq:导致 Frozen Worker 的两个风险 Rails 中用 RabbitMQ 做消息队列【译】 ActiveSupport 利用 ActiveSupport::Notifications 在 Rails 中实现 PUB/SUB

  • 本文向大家介绍Ruby on Rails 从Rails 4.2升级到Rails 5.0,包括了Ruby on Rails 从Rails 4.2升级到Rails 5.0的使用技巧和注意事项,需要的朋友参考一下 示例 注意:升级Rails应用程序之前,请务必确保将代码保存在版本控制系统(例如Git)上。 要从Rails 4.2升级到Rails 5.0,必须使用Ruby 2.2.2或更高版本。如果需要,

  • 第十章 “trait:定义共享的行为” 部分,我们第一次涉及到了 trait,不过就像生命周期一样,我们并没有覆盖一些较为高级的细节。现在我们更加了解 Rust 了,可以深入理解其本质了。 关联类型(associated types)是一个将类型占位符与 trait 相关联的方式,这样 trait 的方法签名中就可以使用这些占位符类型。trait 的实现者会针对特定的实现在这个类型的位置指定相应的

  • 在这个优秀团队的帮助下,我能够安装Rails。下一步是升级Rails。我按照文档中的建议尝试了两种方法,但都出现了错误。。。 C:\网站 C:\网站 我回顾了评论中给出的链接,但我真的不明白...抱歉。我希望有一个直接的解决办法。谢啦 我查看了GoRails站点,它需要一个Linux子系统,这似乎比我需要的要多,在线课程的讲师没有提到。我已经为运行Rails安装了所有东西,但最后一步是将Rails

  • 基础章节介绍了如何组织简单的 Redux 应用。在这一章节中,将要学习如何使用 AJAX 和路由。 异步 Action 异步数据流 Middleware 搭配 React Router 搭配 TypeScript 示例:Reddit API 下一步

  • 这一部分,我们将深入探讨 redux-saga 提供的更强大的 Effect。 链接 监听未来的 action 无阻塞调用 同时执行多个任务 在多个 Effects 之间启动 race 通过 yield* 对 Sagas 进行排序 组合 Sagas 任务的取消 常见的并发模式 Sagas 测试示例 连接 Sagas 至外部输入和输出