2016-05-16 11 views
5

Ho una tabella, 'lavori' con uno stato 'campo' enum. lo stato ha il seguente enumerazione:Ricerca su un campo Enum con Riscatto

enum status: [ :draft, :active, :archived ] 

utilizzando il ransack, come si filtra la tabella per, ad esempio, tutti i record attivi?

+0

Si prega di postare ciò che hai provato finora. – floum

risposta

5

È possibile dichiarare proprio ransacker nel modello come questo:

ransacker :status, formatter: proc {|v| statuses[v]} do |parent| 
    parent.table[:status] 
end 

quindi è possibile utilizzare la sintassi predefinita ransack _eq per verificare l'uguaglianza in questo modo: Se il nome colonna non:

Model.ransack(status_eq: 'active').result 
Modifica

cambiare è possibile saltare il codice:

ransacker :status, formatter: proc {|v| statuses[v]} 
+0

Grazie. funziona, ma sembra che potrei anche usare il valore param e fare una ricerca regolare. il codice si legge un po 'meglio/semplice in questo modo. L'aggiunta di un filtro in ActiveAdmin ha funzionato senza creare un ransacker, anche se utilizzano Ransack per il loro filtraggio. Sembra strano non ha funzionato sul front end facilmente. – Will

+0

@Will Yeap, è possibile utilizzare solo un semplice ambito. Dovrebbe funzionare bene :) Ma il problema appare quando non puoi saltare usando il saccheggio. Senza il codice menzionato sopra, verrà sempre eseguito il cast del parametro 'active' in intero' .to_i' in modo da ottenere sempre '0' invece del valore corretto. – qarol

6

Questo è qualcosa che io se nelle mie opinioni per enumeri e saccheggi:

<%= f.select :status_eq, Model.statuses.to_a.map { |w| [w[0].humanize, w[1]] }, 
         {:include_blank => true} %> 
+0

Quindi sembra che tu debba passare il valore intero dell'attributo all'hash di q, dato che il ransack non farà la conversazione enum per te. – Donato

+0

Questo funziona meglio! –

Problemi correlati