0

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

我有一个表,其中包含定期从第三方站点抓取的用户数据行。旧数据与新数据一样重要;事实上,旧数据可能被更频繁地使用。引用新数据没有性能问题,因为只有几个人会使用我的服务(我保持我的标准现实)。但是数以千计的用户会被定期抓取(即,过于频繁)。我已经将相应的模型命名为“User”和“UserScrape”

users有列:id, name,email

user_scrapes有列:id, user_id, created_at, address_id,awesomesauce_preference

注意:这些不是真正的模型——user_scrapes 有更多的列——但你可能明白了

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

我想要一个方便的方法,让我可以访问每个用户的最新抓取数据,以便我可以将它与单独的WHERE子句结合起来以进一步缩小范围。那是因为在我的代码的至少十几个部分中,我需要处理来自最新抓取的数据。

到目前为止,我所做的是这个可怕的 hack,它user_scrapes使用常规find_by_sql相关子查询为每个用户选择最新的,然后我pluck删除了ids,然后我where在任何相关查询中添加了一个附加子句(需要最新数据)。

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

我的问题

因此,对于我的UserScrape班级,我怎样才能创建一个名为“current”的方法,例如:UserScrape.find(1337).current.where(address_id: 1234).awesomesauce_preference当我住在地址 1234 和 1235 时,我想知道我awesomsauce_preference在最新地址的情况是什么?

4

1 回答 1

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
于 2013-06-28T05:57:22.627 回答