Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 什么是「;轨道;执行相关子查询?_Mysql_Ruby On Rails_Activerecord_Correlated Subquery - Fatal编程技术网

Mysql 什么是「;轨道;执行相关子查询?

Mysql 什么是「;轨道;执行相关子查询?,mysql,ruby-on-rails,activerecord,correlated-subquery,Mysql,Ruby On Rails,Activerecord,Correlated Subquery,我问的方式可能是错误的,所以我为近乎重复和糟糕的原始措辞道歉。我觉得我现在的问题是试图与Rails抗争,当然,这是一场失败的战斗。因此,我正在寻找实现这一点的惯用Rails方法 我有一个包含用户数据行的表,这些数据是定期从第三方站点上刮取的。旧数据和新数据一样重要;事实上,旧数据可能使用得更频繁。引用新数据时不存在性能问题,因为只有两个人会使用我的服务(我保持标准的现实性)。但是,成千上万的用户会被周期性地删除(也就是说,太频繁了)。我将相应的模型命名为“User”和“userscrap” 表用

我问的方式可能是错误的,所以我为近乎重复和糟糕的原始措辞道歉。我觉得我现在的问题是试图与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
,也不能使用静态方法,但可以使用范围。