2010-10-14 16 views
37

tengo lo siguiente en un controladorRails - Find By con 2 campos?

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

Pero lo quiero encontrar también por otro parámetro, project_id

¿Cómo puedo hacer algo como esto en los carriles?

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

Respuesta

61

sí, se puede hacer hallazgos en un montón de maneras.

Su siguiente ejemplo funciona:

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

- Nota su ejemplo tenía dos user_ids

En los carriles 2.x también puede utilizar las condiciones

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

Y en los carriles 3, puede ser genial como:

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

Gracias, me gusta la primera uno aunque ... Mucho más limpio. – AnApprentice

+0

el último es el de los rieles de 3 vías ... a menos que se ponga dentro de un alcance. – DGM

+1

Acuerde con DGM aquí, los ámbitos son geniales ... Permiso.for (@user) .for (@project) .first es bueno para la legibilidad del código –

4

Prueba esto:

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

carriles de 3 vías con ámbitos:

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

Y entonces usted puede utilizarlo como:

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

Carriles 4 introduce el método find_by:

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

¿Es esta sintaxis susceptible a la inyección de SQL? – csi

+1

Me gustaría saber esto también. Es un poco confuso cuando está bien usar params [: attribute] y cuándo no. – Augusto

+3

No es susceptible a la inyección: la única vez que corre el riesgo de recibir una inyección SQL es cuando interpola un parámetro enviado directamente en una cadena destinada a ser utilizada en una consulta, como 'ModelName.where (" attribute = '# {params [ : atributo]} '")'. Hay casos donde necesita una consulta personalizada que no puede crear con constructores de consultas ActiveRecord, pero en esos casos puede usar la siguiente sintaxis: 'ModelName.where (" attribute =? ", Params [: attribute])' –

Cuestiones relacionadas