2010-10-14 8 views
37

Ho la seguente in un controllerRails - Trova con 2 campi?

def update 
    @permission = Permission.find_by_user_id(params[:user_id]) 

Ma io voglio trovare anche da un altro param, project_id

Come posso fare qualcosa di simile in Rails?

@permission = Permission.find_by_user_id_and_project_id(params[:user_id],params[:user_id]) 

risposta

61

Sì, si può fare reperti in un sacco di modi.

Il vostro esempio di seguito funziona:

@permission = Permission.find_by_user_id_and_project_id(params[:user_id],params[:project_id])

- Nota vostro esempio aveva due user_ids

in Rails 2.x è possibile utilizzare anche le condizioni

@permission = Permission.find(:conditions=>["user_id=? and project_id=?", params[:user_id], params[:project_id]]) 

E in Rails 3, si può essere cool come:

@permission = Permission.where(:user_id=>params[:user_id]).where(:project_id=>params[:project_id]).first 
+0

Grazie, mi piace la prima uno però ... Molto più pulito. – AnApprentice

+0

l'ultimo è il binario 3 vie ... a meno che non sia messo in un ambito. – DGM

+1

Accetto con DGM qui, gli ambiti sono eccezionali .... Permission.for (@user) .for (@project) .primo è un buon indice di leggibilità del codice –

4

Prova questo:

@permission = Permission.find(:conditions => ['user_id = ? and project_id = ?', params[:user_id], params[:project_id]]) 
4

Rails 3 vie con gli ambiti:

scope :by_user_id_and_project_id, lambda {|user_id,project_id| 
    where(:user_id=>user_id).where(:project_id=>project_id]) 
} 

E poi si può utilizzarlo come:

@permission = Permission.by_user_id_and_project_id(params[:user_id],params[:project_id]) 
40

Rails 4 introduce il metodo find_by:

Permission.find_by(user_id: params[:user_id], project_id: params[:project_id]) 
+0

Questa sintassi è suscettibile all'iniezione SQL? – csi

+1

Mi piacerebbe saperlo anche questo. È un po 'di confusione quando va bene usare params [: attribute] e quando non lo è. – Augusto

+3

Non è suscettibile all'iniezione - l'unica volta in cui si è in pericolo di SQL injection è quando si interpola un parametro inviato direttamente in una stringa destinata a essere utilizzata in una query, ad esempio 'ModelName.where (" attribute = '# {params [ : l'attributo]} ' ")'. Vi sono casi in cui è necessaria una query personalizzata che non è possibile creare con i builder di query di ActiveRecord, ma in questi casi è possibile utilizzare la seguente sintassi: 'ModelName.where (" attribute =? ", Params [: attribute])' –