如何在 Rails 3 中将范围与 Ransack 一起使用?

Posted

技术标签:

【中文标题】如何在 Rails 3 中将范围与 Ransack 一起使用?【英文标题】:How can I use scopes with Ransack in Rails 3? 【发布时间】:2012-02-06 23:48:00 【问题描述】:

在我的 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

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

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

这样做会产生以下错误:

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

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

【问题讨论】:

与您的实际问题无关,但您范围的后半部分可能很容易写为joins(:widget_assignments).where('widget_assignments.role_id' =&gt; user.role_ids)?或user.roles.fetch(:id)?不过我可能是错的:) 【参考方案1】:

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

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

【讨论】:

以上是关于如何在 Rails 3 中将范围与 Ransack 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Ransack,搜索多列,一个字段,rails 3

Rails 3.1 Ransack HABTM

在 Ransack 上为 Rails 设置默认搜索参数

rails gem ransack 之模糊搜索

Rails Ransack gem:使用一个条件搜索多个值

在rails应用程序中使用Ransack搜索表单中的关联多对多关联