【问题标题】:How can I use scopes with Ransack in Rails 3?如何在 Rails 3 中将范围与 Ransack 一起使用?
【发布时间】: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)?不过我可能是错的:)

标签: ruby-on-rails ruby-on-rails-3 meta-search scopes


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多