如何在 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' => user.role_ids)
?或user.roles.fetch(:id)
?不过我可能是错的:)
【参考方案1】:
将self.all
更改为self.scoped
。 all
返回一个数组。
Rails 4 更新:all
现在将返回一个范围。
【讨论】:
以上是关于如何在 Rails 3 中将范围与 Ransack 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章