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