2010-10-14 15 views
37

Mam następujący w kontrolerzeSzyny - Znajdź według 2 pól?

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

ale chcę go również znaleźć inną param, project_id

Jak można zrobić coś takiego w Rails?

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

Odpowiedz

61

Tak, można to zrobić znaleziska na kilka sposobów.

Twój przykład poniżej działa:

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

- Uwaga swój przykład miał dwa user_ids

W szyn 2.x można również użyć warunki

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

aw Rails 3, możesz być fajny jak:

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

Dzięki, lubię pierwszy jedno jednak ... Dużo czystsze. – AnApprentice

+0

ostatnia to szyny 3-drogowe ... chyba że włożymy w lunetę. – DGM

+1

Zgadzam się z DGM tutaj, zakresy są świetne .... Permission.for (@user) .for (@project) .first jest dobre dla czytelności kodu –

4

Spróbuj tego:

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

Rails 3 way z zakresów:

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

a następnie można używać jak:

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

Szyny 4 wprowadza metodę find_by:

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

Czy ta składnia jest podatna na SQL Injection? – csi

+1

Chciałbym to również poznać. To trochę zagmatwane, gdy można używać params [: attribute], a kiedy nie. – Augusto

+3

Nie jest podatny na wstrzyknięcie - jedyny moment, w którym występuje ryzyko wstrzyknięcia SQL, polega na interpolacji przesłanego paramu bezpośrednio do ciągu znaków, który ma być użyty w zapytaniu - np. 'ModelName.where (" attribute = '# {params [ : atrybut]} "") '. Są przypadki, w których potrzebujesz niestandardowego zapytania, którego nie możesz utworzyć za pomocą konstruktorów zapytań ActiveRecord, ale w tych przypadkach możesz użyć następującej składni: 'ModelName.where (" atrybut =? ", Parametry [: atrybut])' –

Powiązane problemy