Sql Rails每天显示不同的对象

Sql Rails每天显示不同的对象,sql,ruby-on-rails,ruby,postgresql,activerecord,Sql,Ruby On Rails,Ruby,Postgresql,Activerecord,我希望每天将我的用户与他/她的社区中的不同用户进行匹配。目前,我使用的代码如下: @matched_user = User.near(@user).order("RANDOM()").first 但我希望每天都有一个不同的@matched_用户。我在堆栈或API中找不到任何让我了解如何做的东西。我觉得这应该比使用cron执行rake任务更简单。(我在postgres。)使用PostgreSQL的SETSEED功能怎么样?我用日期来播种,这样种子每天都会变化,但在一天之内,种子会保持一致 Use

我希望每天将我的用户与他/她的社区中的不同用户进行匹配。目前,我使用的代码如下:

@matched_user = User.near(@user).order("RANDOM()").first

但我希望每天都有一个不同的@matched_用户。我在堆栈或API中找不到任何让我了解如何做的东西。我觉得这应该比使用cron执行rake任务更简单。(我在postgres。)

使用PostgreSQL的
SETSEED
功能怎么样?我用日期来播种,这样种子每天都会变化,但在一天之内,种子会保持一致

User.connection.execute "SELECT SETSEED(#{Date.today.strftime("%y%d%m").to_i/1000000.0})"
@matched_user = User.near(@user).order("RANDOM()").first
使用此选项后,您可能希望种子设定一个随机值,以便以后对random的任何调用都不会产生偏差:

random = User.connection.execute("SELECT RANDOM()").to_a.first["random"]
# Same code as above:
User.connection.execute "SELECT SETSEED(#{Date.today.strftime("%y%d%m").to_i/1000000.0})"
@matched_user = User.near(@user).order("RANDOM()").first
# Use random value before seed to make new seed:
User.connection.execute "SELECT SETSEED(#{random})"

为了便于阅读,我将这些步骤分为不同的部分。您可以稍后优化查询

1) 找到今天早上之前的所有用户记录。这样计数就会冻结

usrs_till_today_morning = User.where("created_at <?", DateTime.now.in_time_zone(Time.zone).beginning_of_day)
3) 今天的日期将是一个范围(1..30),但将在一天中保持不变

day_today = Time.now.day
4) 为当天选择相同的ID

todays_user_id = user_ids[day_today % user_ids.count]

@matched_user =  User.find(todays_user_id)

因此,它将通过全天维护相同的记录,为您提供随机用户记录

每当我发现自己渴望共享“内存”或瞬时状态时,我就对自己说,“这就是(分布式)缓存的发明目的”

注意:虽然为缓存条目指定TTL会告诉Rails/缓存系统在给定的时间段内尝试保持该值,但不能保证它会保持该值。特别是,积极尝试回收内存的缓存可能会在其所需的
过期时间之前很早就过期


对于这个特定的用例,这应该不是什么大问题,但是如果业务/域逻辑需要周期性地生成持久的值,那么您真的必须将其考虑到您的数据库中。

您的意思是@matched_用户在相同的24小时内对所有请求都是相同的吗?我没有这样想过,但是是的,啊!总是寻找Rails已经包含人们需要的东西的方法。我打算推荐一个包含用户id外键(唯一)的邻居表。然后,他们可以将
更新的
字段与
时间、现在、午夜、自(86400)
进行比较。因此,如果创建的_-at超过24小时,则可以告诉它使用随机人员进行更新。但是缓存要好得多。哇,直到现在我才知道Rails中有这种类型的缓存。回答得很好,比我的效率高很多。哇,这绝对是我所不知道的。当我将这段代码插入控制器时,它现在显示为“nil”,而之前为@matched_user编写的代码过去可以工作。你知道为什么缓存会出故障吗?这是dev模式的问题吗?@MatthewMelone您以前可能尝试过
获取相同的密钥,并且块返回了
nil
。当这种情况发生时,在缓存使该键过期之前,随后对同一键调用
fetch
,当然会返回
nil
。特别是,请尝试
Rails.cache.delete(key)
Rails.cache.clear
重置缓存。
todays_user_id = user_ids[day_today % user_ids.count]

@matched_user =  User.find(todays_user_id)
@matched_user = Rails.cache.fetch(@user.cache_key + '/daily_match', expires_in: 1.day) {
  User.near(@user).order("RANDOM()").first
}