执行相关子查询的“Rails方式”是什么?

时间:2013-06-28 05:07:52

标签: mysql ruby-on-rails activerecord correlated-subquery

我可能以错误的方式问nearly the same question,所以我为近乎重复和糟糕的原始措辞道歉。我觉得我现在的问题是试图对抗Rails,这当然是一场失败的战斗。因此,我正在寻找惯用的Rails方法来做到这一点。

我有一个包含用户数据行的表格,这些用户数据会定期从第三方网站上删除。旧数据与新数据同样重要;事实上,旧数据可能更常用。引用新数据没有性能问题,因为只有几个人会使用我的服务(我保持标准的真实性)。但是周期性地刮掉了数千个用户(即,过于频繁地)。我已将相应的模型命名为“User”和“UserScrape”

users包含以下列:idnameemail

user_scrapes包含以下列:iduser_idcreated_ataddress_idawesomesauce_preference

注意:这些不是真正的模型 - user_scrapes有更多的列 - 但你可能得到了点

在任何给定时间,我想找到与从给定用户的外部源检索的数据相关联的最新 user_scrapes值。我想知道我现在的awesomeauce_preference是,因为最近它可能是'lamesauce',但之前它是'saucy_sauce'。

我希望有一个方便的方法,允许我以这样的方式访问每个用户的最新抓取数据,以便我可以将它与单独的WHERE子句组合以进一步缩小范围。那是因为在我的代码的至少十几个部分中,我需要处理来自最新版本的数据。

到目前为止我所做的是这个可怕的黑客攻击,为每个用户选择最新的user_scrapes,并使用常规的find_by_sql相关子查询,然后pluck id where在刮擦中,然后我在任何相关查询中添加了一个UserScrape子句(需要最新数据)。

这已经成为性能方面的一个问题,因为我不想缓冲超过一百万个整数(是的,很多页面经常被删除)然后尝试将MySQL驱动程序列入这些列表并奇迹般地执行完美的查询计划。在我的基准测试中,写这篇文章几乎和我一样长,所以我之前撒了谎。性能有点是一个问题,但不是真的。

我的问题

因此,对于我的UserScrape.find(1337).current.where(address_id: 1234).awesomesauce_preference课程,我如何制作一个名为'current'的方法,如:awesomsauce_preference当我住在地址1234和1235时,我想知道我的{{1} 1}}是我最新的地址?

1 个答案:

答案 0 :(得分:1)

我认为你要找的是范围:

http://guides.rubyonrails.org/active_record_querying.html#scopes

特别是,您可以使用:

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