has_many unscope

ruby

先show一段代码,用户只能看到一年内有更新且没有被隐藏的post

class User < ActiveRecord::Base
  has_many :posts
end
class Post < ActiveRecord::Base
  belongs_to :user
  default_scope {where('updated_at > ?', Time.now - 1.year).where(is_hidden: false)}
end

如果业务变更了,某类用户登录,可以看到隐藏的post,但是依旧只能看到一年内有更新的,可以这么写

class User < ActiveRecord::Base
  has_many :posts
  has_many :hidden_or_unhidden_posts, -> {unscope(where: :is_hidden)}, class_name: "Post"
end

这时候 User.find(1).hidden_or_unhidden_posts将会看到隐藏的post

不过值得注意的是,unscope不会对SQL生效,比如加上unscope(where: :updated_at)并不会对前面的 SQL 进行unscope

发表于 2019.06.27