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
}