2012-01-10 25 views
5

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?

+0

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 :) –

Respuesta

8

Cambie self.all por self.scoped. all devuelve una matriz.

Actualización para Rieles 4: all volverá ahora un ámbito.

Cuestiones relacionadas