2010-10-14 28 views
37

Tôi có sau đây trong một bộ điều khiểnĐường ray - Tìm theo với 2 trường?

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

Nhưng tôi muốn nó cũng tìm thấy bằng param khác, project_id

Làm thế nào tôi có thể làm một cái gì đó như thế này trong Rails?

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

Trả lời

61

Vâng, bạn có thể làm phát hiện trong một loạt các cách khác nhau.

dụ của bạn dưới đây hoạt động:

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

- Chú ý Ví dụ bạn đã hai user_ids

Trong ray 2.x bạn cũng có thể sử dụng điều kiện

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

Và trong Rails 3, bạn có thể làm mát như:

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

Cảm ơn, tôi muốn là người đầu tiên mặc dù ... sạch hơn rất nhiều. – AnApprentice

+0

cái cuối cùng là đường ray 3 chiều ... trừ khi đưa vào phạm vi. – DGM

+1

Đồng ý với DGM ở đây, phạm vi rất tuyệt ... Permission.for (@user) .for (@project) .first là một điều tốt cho khả năng đọc mã –

4

Hãy thử điều này:

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

Rails 3 chiều với phạm vi:

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

Và sau đó bạn có thể sử dụng nó như:

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

Rails 4 giới thiệu các phương pháp find_by:

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

Cú pháp này có dễ bị SQL Injection không? – csi

+1

Tôi cũng muốn biết điều này. Đó là một chút bối rối khi nó là ok để sử dụng params [: thuộc tính] và khi nó không. – Augusto

+3

Nó không dễ bị tiêm - thời gian duy nhất bạn có nguy cơ tiêm SQL là khi bạn nội suy một tham số được gửi trực tiếp vào một chuỗi được sử dụng trong truy vấn - như 'ModelName.where (" attribute = '# {params [ : thuộc tính]} '")'. Có những trường hợp bạn cần truy vấn tùy chỉnh mà bạn không thể tạo bằng trình tạo truy vấn ActiveRecord, nhưng trong những trường hợp đó bạn có thể sử dụng cú pháp sau: 'ModelName.where (" attribute =? ", Params [: attribute])' –

Các vấn đề liên quan