在我的小部件模型中,我有以下内容:

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
}

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

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

这样做会生成以下错误:

未定义的方法“搜索”数组:0x007FF9B87A0300

我猜是Ransack正在寻找Activerecord关系对象而不是数组。无论如何,我是否可以将范围用作Ransack的过滤器?

有帮助吗?

解决方案

更改 self.all 为了 self.scoped. all 返回一个数组。

Rails 4的更新: all 现在将返回范围。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top