2012-01-10 17 views
5

Nel mio modello Widget ho il seguente:Come posso utilizzare gli ambiti con Ransack in 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, vorrei utilizzare questo ambito come un filtro per i risultati di ricerca di Ransack, così nel mio controller ho:

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

Doing questo genera il seguente errore:

undefined method `search' for Array:0x007ff9b87a0300

sto indovinando che Ransack è alla ricerca di un oggetto relazione ActiveRecord e non un array. C'è comunque che posso usare il mio scope come filtro per Ransack?

+0

Non correlato alla domanda attuale, ma la seconda metà dell'ambito potrebbe probabilmente essere scritta facilmente come 'joins (: widget_assignments) .where ('widget_assignments.role_id' => user.role_ids)'? o 'user.roles.fetch (: id)'? Potrei sbagliarmi però :) –

risposta

8

Modificare self.all per self.scoped. all restituisce un array.

Aggiornamento per Rails 4: all restituirà ora un ambito.

Problemi correlati