如何在Rails 3中使用带Ransack的范围?

jkl*_*ina 5 ruby-on-rails meta-search scopes ruby-on-rails-3

在我的Widget模型中,我有以下内容:

scope :accessible_to, lambda { |user|
  if user.has_role?('admin')
    self.all
  else
    roles = user.roles
    role_ids = []
    roles.each { |r| role_ids << r.id }
    self.joins(:widget_assignments).where('widget_assignments.role_id' => role_ids)
   end
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想使用此范围作为Ransack搜索结果的过滤器,因此在我的控制器中我有:

def index
  @q = Widget.accessible_to(current_user).search(params[:q])
  @widgets = @q.result.order('created_at DESC')
end
Run Code Online (Sandbox Code Playgroud)

这样做会产生以下错误:

未定义的方法`search'for Array:0x007ff9b87a0300

我猜Ransack正在寻找一个ActiveRecord关系对象,而不是一个数组.无论如何,我可以使用我的范围作为Ransack的过滤器吗?

Hoc*_*ock 8

改变self.allfor self.scoped.all返回一个数组.

Rails 4的更新:all现在将返回一个范围.