给定一个带有default_scope的模型来过滤所有过时的条目:
# == Schema Information
#
# id :integer(4) not null, primary key
# user_id :integer(4) not null, primary key
# end_date :datetime
class Ticket < ActiveRecord::Base
belongs_to :user
default_scope :conditions => "tickets.end_date > NOW()"
end
Run Code Online (Sandbox Code Playgroud)
现在我想得到任何票.在这种情况下,with_exclusive_scope是要走的路,但这种方法是否受到保护?只有这个有效:
Ticket.send(:with_exclusive_scope) { find(:all) }
Run Code Online (Sandbox Code Playgroud)
有点黑客,不是吗?那么正确的使用方法是什么?特别是在处理协会时,情况变得更糟(假设用户有很多票):
Ticket.send(:with_exclusive_scope) { user.tickets.find(:all) }
Run Code Online (Sandbox Code Playgroud)
这是如此丑陋! - 不能成为轨道!?
我有一个具有以下default_scope的用户模型:
default_scope where(account_id: Account.current_account.id)
如果我打电话,User.all我总是根据当前帐户获得结果.
在某些情况下,出于管理目的,我想绕过该范围并查看系统中的所有用户,无论帐户如何.
有没有办法做到这一点?
我想要一个模型,我需要软删除一条记录,而不是在搜索时显示它们或任何其他条件.
我想保留模型而不删除记录.怎么去这个?
我有一种情况,现有应用程序的行为正在发生变化,这让我头疼.
我的应用有照片.照片有一个状态:"batch", "queue", or "complete".应用中的所有现有照片都是"完整的".
99%的时间我只需要显示完整的照片,而在所有现有的代码库中,我需要每次调用照片仅限于完整的照片.
但是,在与上传和分类照片相关的屏幕中,我需要能够相当轻松地覆盖默认范围以显示批量或排队的照片.
像许多其他人一样,我需要找到一种在某些情况下轻松覆盖默认范围的方法.我看着这些问题(1,2),他们似乎并没有回答我要找的.
我希望的代码是这样的:
class Photo < ActiveRecord::Base
...
default_scope where(:status=>'complete')
scope :batch, unscoped.where(:status=>'batch')
scope :queue, unscoped.where(:status=>'queue')
...
end
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.我尝试在lambdas中包装范围方法,但这也不起作用.
我知道default_scope带有行李,但是如果我不能使用覆盖,那么我正在寻找添加scope :complete ...并且必须梳理我现有应用程序中每次调用照片并添加.complete以过滤未处理的照片.
你会如何解决这个问题?
activerecord named-scope ruby-on-rails default-scope ruby-on-rails-3