我有一个-- Read bytes in big-endian order (most significant byte first)
-- Little-endian order is fromBytes . BS.reverse
fromBytes :: (Bits a, Num a) => ByteString -> a
fromBytes = BS.foldl' f 0
where
f a b = a `shiftL` 8 .|. fromIntegral b
模型user
订阅。我需要做两个选择:
has many
定义为上个月订阅的用户
active users
不符合(1)标准的
我的inactive users
模型有一个简单的范围subscription
,定义为.latest
。
要进行选择(1)我使用:
ordered("created_at DESC").first
这有效,没有问题。但是,我似乎无法为选择(2)定义工作查询。目前,我使用User.joins(:subscriptions).where("subscriptions.created_at > ?", 1.month.ago).distinct
中的selection(1)和'subtract'来获取剩余的用户。这感觉有点像黑客。
我需要的选择是:
User.all
查询的all users whose most recent subscription was created more than 1 month ago
部分让我陷入困境。
任何帮助表示感谢。
答案 0 :(得分:0)
快速&脏的方式:像这样使用复杂的SQL
假设您使用的是自动增量ID
User.select("users.*, MAX(subscriptions.id) as last_subscription_id")
.joins(:subscriptions)
.group("subscriptions.user_id")
.having("last_subscription_id = (select id from subscriptions where user_id=users.id and created_at < '2017-10-01 09:23:28.182475' order by id desc limit 1)")
推荐方式
将last_subscription_id
添加到users
表并设置belongs_to
关系user belongs_to last_subscription
,然后正常执行joins
。当创建此用户的新订阅时,您还需要更新用户的last_subscription_id
。
示例:User
类看起来像这样(我包含has_many :subscriptions
以表明我们现在有2个关系)
class User < ActiveRecord::Base
has_many :subscriptions
belongs_to :last_subscription, class_name: 'Subscription', foreign_key: :last_subscription_id
end
查询将是
User.joins(:last_subscription).where("subscriptions.created_at < ?", 1.month.ago)
答案 1 :(得分:0)
对于最近的部分,你可以这样做。
User.joins("LEFT JOIN subscriptions ON subscriptions.user_id = users.id").order("subscriptions.created_at DESC").select("subscriptions.created_at AS max_date").group_by(&:id).select{|key, value| value[0].max_date < 1.month.ago}.values.flatten