En mi modelo Widget Tengo el siguiente:¿Cómo puedo usar ámbitos con Ransack en Rails 3?
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
}
Idealmente, me gustaría usar este ámbito como un filtro de resultados de búsqueda de Ransack, así que en mi controlador que tengo:
def index
@q = Widget.accessible_to(current_user).search(params[:q])
@widgets = @q.result.order('created_at DESC')
end
Hacer esto genera el siguiente error:
undefined method `search' for Array:0x007ff9b87a0300
supongo que Ransack está buscando un objeto ActiveRecord relación y no una matriz. ¿Hay alguna forma de que pueda usar mi alcance como filtro para Ransack?
No relacionado con su pregunta real, pero la segunda mitad de su alcance probablemente podría escribirse fácilmente como 'une (: widget_assignments) .where ('widget_assignments.role_id' => user.role_ids)'? o 'user.roles.fetch (: id)'? Sin embargo, podría estar equivocado :) –