我想找到在给定周内创建的所有项目,并传递一周的数字参数.(created_at是正常时间戳.)
给定一周的数字,在该特定周内找到日期的最简单方法是什么?(本周的任何日期都可以,因为我将在范围内使用beginning_of_week和end_of_week.)
我有一个Postgres 时钟闹钟表(不是真的,但这是类似的,更容易解释).用户以1小时的分辨率设置警报,用户可以来自许多不同的时区.警报每天重复.我想要可靠地获取在一天中的特定时刻应该关闭的警报,并且我遇到夏令时问题.我该如何以最好的方式做到这一点?
阿尔弗雷德和洛塔都住在斯德哥尔摩(从UTC开始+1小时,但在DST时为+ 2小时).
Sharon住在新加坡(距离UTC +8小时,没有夏令时)在冬季,阿尔弗雷德在凌晨4点发出警报.警报应该在当地时间凌晨4点全年开始.
在夏季,Lotta在凌晨5点发出警报.它应该全年都在凌晨5点出发.
与此同时,沙龙已经在上午11点发出警报.所有这些都可以03:00 UTC的形式存储在数据库中.
如果我在冬天查询数据库以获取应在03:00 UTC发出的警报,我想要Alfred和Sharon的警报.新加坡现在离瑞典只有7小时,所以新加坡上午11点在瑞典凌晨4点.洛塔的警报不应该再持续一小时.
相反,如果我在夏天查询数据库以获取应在03:00 UTC发出的警报,我想要Lotta和Sharon的警报.新加坡现在离瑞典只有6小时,所以新加坡上午11点在瑞典上午5点.斯文的闹钟在一小时前响起.
我如何存储它,并查询数据库?
如有必要,我可以更改数据库架构.目前,我们根本没有调整DST,事实上只有一个"小时"整数字段(看似愚蠢,时间字段会更好).
我似乎需要存储UTC时间和时区信息,但我不知道如何在Postgres中最好地实现这一点.我发现Postgres有一些时区概念,但据我所知,没有时区字段类型.此外,我想我需要在SQL中进行一些计算,以确定如何根据时区数据和创建日期来偏移select中的UTC时间.我对SQL不太满意......
我想在Postgres中解决这个问题,因为可能存在很多"警报",我想避免将所有这些问题都引入Ruby并在那里过滤所带来的性能问题.(是的,这是一个Rails应用程序.)
我有三个ActiveRecord模型:Partner,MembershipChannel(这是一个STI模型,继承自Channel)和ChannelMembership(我不负责命名这些模型......)
当我通过合作伙伴协会加载ChannelMembership时,我有时(!)最终得到一个只读记录.这是在Rails 3.0.9中.相同的代码在2.3.11中没有这样做.
> p = Partner.first
> p.channel_memberships.map(&:readonly?)
# => [false, false, false, false, false, false]
> p.reload.channel_memberships.limit(1).first.readonly?
# => false
> p.reload.channel_memberships.first.readonly?
# => true
Run Code Online (Sandbox Code Playgroud)
调用关联readonly?
时为什么是真的first
,而不是来自关系limit
?
我知道readonly
如果我在查找记录时使用SQL片段会触发,但这不是这种情况.通过关联只是一个简单的has_many.唯一复杂的问题是它加入了STI模型.更重要的是,从最后两个示例中查看生成的SQL,它们是完全相同的!
我可以通过指定:readonly => false
关联来获得我想要的行为,但我想了解发生了什么.
Channel,MembershipChannel或ChannelMembership上没有默认范围.以下是合作伙伴的关联声明:
class Partner
has_many :membership_channels
has_many :channel_memberships, :through => :membership_channels
end
Run Code Online (Sandbox Code Playgroud)
这是我日志中生成的SQL:
Partner Load (0.4ms) SELECT "partners".* FROM "partners" LIMIT 1
ChannelMembership Load (0.7ms) SELECT "channel_memberships".* FROM "channel_memberships" INNER JOIN "channels" ON "channel_memberships".channel_id = "channels".id WHERE (("channels".partner_id = …
Run Code Online (Sandbox Code Playgroud)