如何使用Activerecord选择最近一个孩子的父母

时间:2017-11-01 08:39:21

标签: sql ruby-on-rails activerecord

我有一个-- 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订阅。我需要做两个选择:

  1. has many定义为上个月订阅的用户

  2. active users不符合(1)标准的

  3. 我的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部分让我陷入困境。

    任何帮助表示感谢。

2 个答案:

答案 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