ActiveRecord排除所有查询的结果

时间:2014-07-03 14:29:46

标签: ruby-on-rails ruby activerecord

因此,出于某种原因,我的客户端不会从其数据库中删除非活动用户。有没有办法全局排除所有对users表的所有ActiveRecord调用的非活动用户?

EX:User.where("status != 'Inactive'")

我希望这是全球性的,所以我不必在每个用户声明中都包含它。

3 个答案:

答案 0 :(得分:9)

是的,您可以设置默认范围:

class User < ActiveRecord::Base
  default_scope where("status != 'Inactive'")
end

User.all # select * from users where status != 'Inactive'

...但你不应该

当你不可避免地忘记有一个默认范围时,它只会导致麻烦,并且为什么你无法找到你的记录而感到困惑。

它还会对关联造成严重破坏,因为属于不在默认范围内的用户的任何记录都会突然显示属于无用户。

如果您对帖子和用户进行了简单设置,并且用户有默认范围,那么您最终会得到以下内容:

# we find a post called 1
p = Post.first # <#post id=1>

# It belongs to user 2
p.user_id # 2

# What's this? Error! Undefined method 'firstname' for `nil`!
p.user.first_name

# Can't find user 2, that's impossible! My validations prevent this,
# and my associations destroy dependent records. Can't be!
User.find(2) # nil

# Oh, there he is.
User.unscoped.find(2) <#user id=2 status="inactive">

在实践中,这将始终 。通过它的ID查找记录非常常见,然后尝试查找拥有它的相关记录以验证权限等。您的逻辑可能会被写入以假设相关记录存在,因为验证应该防止它不存在。突然之间,你会发现自己在nil课程中遇到了很多未定义的方法空白&#34;错误。

明确你的范围要好得多。定义一个名为active,并使用User.active明确选择您的活跃用户:

class User < ActiveRecord::Base
  scope :active, -> where("status != 'Inactive'")
end

User.active.all # select * from users where status != 'Inactive'

我只会建议使用default_scopeorder(:id)应用于您的记录,这有助于.first.last更加明智地行事。我绝不会建议使用它来默认排除记录,这已经咬了我太多次了。

答案 1 :(得分:2)

当然,在您的模型中定义默认范围 有关详细信息,请参阅here

例如

class Article < ActiveRecord::Base
  default_scope where(:published => true)
end

Article.all # => SELECT * FROM articles WHERE published = true

答案 2 :(得分:0)

作为@ meagar建议的替代方法,您可以创建一个与Users表结构相同的新表,称为InactiveUsers,并将人员移到此处,当您这样做时将其从用户中删除。这样,您仍然可以在数据库中使用它们,并且可以根据需要将它们还原为用户。