我可能以错误的方式问nearly the same question,所以我为近乎重复和糟糕的原始措辞道歉。我觉得我现在的问题是试图对抗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
子句组合以进一步缩小范围。那是因为在我的代码的至少十几个部分中,我需要处理来自最新版本的数据。
到目前为止我所做的是这个可怕的黑客攻击,为每个用户选择最新的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}}是我最新的地址?
答案 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