我有几个模型belong_to :status
。
状态是:
我为每种状态设置了范围,它们适用于用户和其他几种内容模型,但我们以User
为例。
出于习惯,我写User.find(15)
或User.all
或User.last(5)
或@category.users
我认为没有任何理由可以改变这种情况。事实上,叫我自私,但我想要来改变它。我觉得我应该能够在更高的层次上处理这类任务,并避免不得不一遍又一遍地重新打字:
User.active.where(...)
User.active
User.active.last(5)
@category.users.active
这似乎是非常规的。不幸的是,这些模型在很多实例中都被使用,因此我想在模型级别上预先设置禁用或隐藏模型的预览。例如,从all
范围中删除禁止的实例,但是除了“last”之外的范围或者一般查询模型时。或者,如果某个实例被特定地调用,并且具有禁止或隐藏的范围,则会引发未找到的记录。我仍然希望能够通过各自的范围(例如User.banned
或User.hidden
)访问这些实例,但我宁愿 是额外的输入,而不是最常用的查询。
答案 0 :(得分:2)
您需要定义一些范围
default_scope joins(:status).where(:status => {:state => :active})
scope :hidden, unscoped.joins(:status).where(:status => {:state => :hidden})