【问题标题】:How do i not include latest record but all record from an object in rails?我如何不包含最新记录,而是包含 Rails 中对象的所有记录?
【发布时间】:2016-04-05 19:15:40
【问题描述】:

例如,如果我想使用@posts.all 提取所有@posts,但我不想包含其中的最后一条或最新记录?

这就是我想要做的,

@posts = Post.all(没有创建的最新记录。)

基本上所有记录,但不是最后一条记录。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 activerecord rails-activerecord


    【解决方案1】:

    我认为尝试生成排除最后一个元素的 SQL 查询是不值得的。尤其是子查询可能比仅将所有记录加载到 Array 和排除最后一条记录要慢:

    @posts = Post.all[0..-2]
    

    您在 cmets 中的另一个示例如下所示:

    @contact_prices = @contact.retail_prices.all.order("created_at DESC").load[0..-2]
    

    另一个选项(取决于您的关系顺序)可能是使用offset

    @contact_prices = @contact.retail_prices.order("created_at DESC").offset(1)
    

    【讨论】:

    • 所以我有这个对象,@contact_prices = @contact.retail_prices.all.order("created_at DESC") 没有用
    • 这将返回一个数组而不是 AR 对象
    • 我认为 OP 没有定义他需要 Relation 而不是 Array
    • 他要求的结果类型与 Post.all 相同,不是吗?
    • 我很惊讶,因为[1..@contact.retail_prices.count] 会跳过第一个。比只使用offset(1) 可能更好
    【解决方案2】:

    这是我认为做你想做的事情的最直接的方式:

    Post.limit(Post.count - 1)
    

    如果您希望您的查询允许分页或其他 LIMIT 查询,您可以尝试类似

    Post.where("id < ?", Post.last.id)
    

    【讨论】:

    • 不是真正的竞争条件,只是得到一个不同步的计数。在这种情况下似乎不太重要,但肯定会为彻底性+1。我认为如何实现事务的细节取决于你希望它被锁定的程度(例如,你可以锁定它以确保没有在中间创建或删除帖子,但我认为这太重了)。没有确保数据同步的最坏情况是你得到了一个你不应该有的帖子,或者你没有得到一个你应该有的帖子,但这就像你之前执行了该行一样。
    【解决方案3】:

    很多答案都可以解决问题,但会抛出一个额外的选项:

    @posts = Post.where("id != ?", Post.last.id)
    

    【讨论】:

      【解决方案4】:

      单行增强现实:

      Post.where.not(id: Post.last&.id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 2016-02-19
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        相关资源
        最近更新 更多