【问题标题】:Avoid Activerecord relation to be reloaded in Rails避免在 Rails 中重新加载 Activerecord 关系
【发布时间】:2017-08-21 06:51:08
【问题描述】:

Lats 说我有一些关系:

@active_posts = Post.where(active: true).limit(3) # returns 3 active posts, but there are much more then 3 

然后我修改了这个关系的一些成员:

@active_posts.first.update active: false
@active_posts.size # returns 3, but need 2 remaining 

我如何才能获得此关系中的其余 2 个活跃帖子?当我尝试遍历@active_posts 时,它会从数据库中重新加载,并用活动的帖子替换停用的帖子。但是我怎样才能从这个关系中准确地找到 2 个活跃的帖子,在停用第三个之后剩下呢?

【问题讨论】:

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


    【解决方案1】:

    使用范围

    class Post < ActiveRecord::Base
      scope :actived, -> { where(active: true) }
      scope :deactived, -> { where(active: false) }
    end
    
    @active_posts = Post.actived # returns 3 active posts
    @active_posts.first.update active: false
    @active_posts.reload
    @active_posts = Post.actived
    

    【讨论】:

    • 并非如此。因为最后一条语句再次返回 3 个激活的帖子(db 有超过 3 个活跃的帖子。我应该修复我的示例。
    • @Molfar 不幸的是,Rails 并不那么聪明。不调用#reload 并始终使用范围是一个好习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多