2010-10-14 5 views
37

Ich habe folgendes in einem ControllerSchienen - Find von mit 2 Feldern?

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

Aber ich will es auch von einem anderen param zu finden, project_id

Wie kann ich so etwas wie dies in Rails zu tun?

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

Antwort

61

Ja, Sie können von Möglichkeiten in einem Haufen Funde machen.

Ihr Beispiel unten funktioniert:

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

- Hinweis Ihr Beispiel zwei benutzerkennungen hatte

In Schienen 2.x Sie auch

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

Und in Rails Bedingungen verwenden können, 3, können Sie cool sein wie:

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

Dank, ich mag die erste eine obwohl ... viel sauberer. – AnApprentice

+0

der letzte ist die Schienen 3 Weg ... es sei denn, in einen Bereich gesteckt. – DGM

+1

Vereinbaren Sie mit DGM hier, Bereiche sind großartig .... Permission.for (@user) .for (@project) .first ist eine gute für Code Lesbarkeit –

4

Try this:

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

Rails 3 Art und Weise mit Bereichen:

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

Und dann können Sie es mögen verwenden:

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

Rails 4 stellt die find_by Methode:

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

Ist diese Syntax anfällig für SQL Injection? – csi

+1

Ich möchte das auch wissen. Es ist ein wenig verwirrend, wenn params [: attribute] verwendet wird und wenn nicht. – Augusto

+3

Es ist nicht anfällig für die Injektion - die einzige Zeit, in der Sie von SQL-Injektion bedroht ist, wenn Sie einen übergebenen Parameter direkt in eine Zeichenfolge interpolieren, die in einer Abfrage verwendet werden soll - wie 'ModelName.where (" attribute = '# {params [ : Attribut]} '")'. Es gibt Fälle, in denen Sie eine benutzerdefinierte Abfrage benötigen, die Sie nicht mit ActiveRecord-Abfrageerstellern erstellen können. In diesen Fällen können Sie jedoch die folgende Syntax verwenden: 'ModelName.where (" attribute =? ", Params [: attribute])' –

Verwandte Themen