我可能以错误的方式问了几乎相同的问题,所以我为几乎重复和糟糕的原始措辞道歉。我觉得我现在的问题是试图与 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
删除了id
s,然后我where
在任何相关查询中添加了一个附加子句(需要最新数据)。
这已经是性能方面的问题,因为我不想缓冲超过一百万个整数(是的,很多页面经常被刮掉)然后尝试将这些列表传递给 MySQL 驱动程序并让它奇迹般地执行完美查询计划。在我的基准测试中,写这篇文章的时间几乎和我写这篇文章的时间一样长,所以我之前撒了谎。性能是一个问题,但不是真的。
我的问题
因此,对于我的UserScrape
班级,我怎样才能创建一个名为“current”的方法,例如:UserScrape.find(1337).current.where(address_id: 1234).awesomesauce_preference
当我住在地址 1234 和 1235 时,我想知道我awesomsauce_preference
在最新地址的情况是什么?