Mysql 什么是「;轨道;执行相关子查询?
我问的方式可能是错误的,所以我为近乎重复和糟糕的原始措辞道歉。我觉得我现在的问题是试图与Rails抗争,当然,这是一场失败的战斗。因此,我正在寻找实现这一点的惯用Rails方法 我有一个包含用户数据行的表,这些数据是定期从第三方站点上刮取的。旧数据和新数据一样重要;事实上,旧数据可能使用得更频繁。引用新数据时不存在性能问题,因为只有两个人会使用我的服务(我保持标准的现实性)。但是,成千上万的用户会被周期性地删除(也就是说,太频繁了)。我将相应的模型命名为“User”和“userscrap” 表Mysql 什么是「;轨道;执行相关子查询?,mysql,ruby-on-rails,activerecord,correlated-subquery,Mysql,Ruby On Rails,Activerecord,Correlated Subquery,我问的方式可能是错误的,所以我为近乎重复和糟糕的原始措辞道歉。我觉得我现在的问题是试图与Rails抗争,当然,这是一场失败的战斗。因此,我正在寻找实现这一点的惯用Rails方法 我有一个包含用户数据行的表,这些数据是定期从第三方站点上刮取的。旧数据和新数据一样重要;事实上,旧数据可能使用得更频繁。引用新数据时不存在性能问题,因为只有两个人会使用我的服务(我保持标准的现实性)。但是,成千上万的用户会被周期性地删除(也就是说,太频繁了)。我将相应的模型命名为“User”和“userscrap” 表用
用户
有列:id
,名称
,电子邮件
表user\u scrapes
有列:id
,user\u id
,在创建,地址\u id
,首选项
注意:这些并不是真正的模型-user_scrapes有更多的列-但你可能明白了重点
在任何给定时间,我都希望找到与从外部源从给定用户检索到的数据相关联的最新user\u scrape
值。我想知道我现在的偏好是什么,因为最近可能是“Lamesause”,但之前是“saucy”
我希望有一个方便的方法,让我能够访问每个用户的最新抓取数据,这样我就可以将它与单独的WHERE
子句结合起来,进一步缩小范围。这是因为在我的代码中至少有十几个部分,我需要处理来自最新数据的数据
到目前为止,我所做的是一个可怕的黑客程序,它通过一个常规的find\u by\u sql
相关子查询为每个用户选择最新的user\u scrapes
,然后我提取id
s,然后在任何相关查询中添加一个where
子句(需要最新数据)
这已经是一个性能方面的问题,因为我不想缓冲超过一百万个整数(是的,很多页面经常被刮掉),然后尝试向MySQL驱动程序传递这些整数的列表,让它奇迹般地执行一个完美的查询计划。在我的基准测试中,我写这篇文章的时间几乎和我写这篇文章的时间一样长,所以我以前撒过谎。性能是一个问题,但不是真的
我的问题
因此,在我的UserScrape
类中,如何创建一个名为“current”的方法,如:UserScrape.find(1337.current.where)(地址:1234).awesomesause_preference
当我住在地址1234和1235时,我想知道我最新地址的awesomesause_preference
是什么?我想你要找的是范围:
特别是,您可能可以使用:
scope :current, order("user_scrapes.created_at DESC").limit(1)
更新:
作用域用于返回一个ActiveRecord对象,因此,如果您愿意,可以继续链接方法。没有什么可以阻止你(上次我检查过)写这篇文章,但是:
scope :current, order("user_scrapes.created_at DESC").first
这只返回一个对象,不可链接,但最终它可能是一个更有用的函数
UserScrape.where(address_id: 1234).current.awesomesauce_preference
那么,如果我想要一个{user_id:awesomesause_preference}的散列,我如何得到它?如果我只使用UserScrape.current,我会得到一行数组。我已经更新了答案(只晚了4个月)。您要查找的确切散列必须根据上面得到的awesomesause\u首选项构造自己,即{awesomesause\u preference.user\u id=>awesomesause\u preference}
.A)这是一个如何关联的子查询?B) 如果要查找单个记录,为什么不使用self.method而不是scope呢def self.current self.order('created_at DESC')。第一个结尾
,然后就像是,User.User\u scrapes.current.awesomesause\u preference
或其他什么?甚至可以将其放在User
,def current_scrape User_scrape.order('created_at DESC')。第一个end
@BenSaufley使用范围而不是静态方法的主要原因是,如果需要,可以从适当表的ActiveRecord关系对象调用范围(即,从以前的范围调用链接),静态方法只能在从模型名开始时调用。例如,我上面写的,userscrap.where(address\u id:1234).current.awesomesaude\u preference
将无法使用静态方法。就我所知,即使是您的示例,User.User\u scrapes.current.awesomesause\u preference
,也不能使用静态方法,但可以使用范围。