2010-10-14 3 views
37

У меня есть следующий в контроллереRails - Поиск по 2 полям?

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

Но я хочу, чтобы это также найти другие пары, project_id

Как я могу сделать что-то подобное в Rails?

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

ответ

61

Да, вы можете сделать находками в кучу способов.

Ваш пример ниже работы:

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

- Обратите внимание, ваш пример был два user_ids

В рельсах 2.x вы можете также использовать условия

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

И в Rails 3, вы можете быть крутыми как:

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

Спасибо, я как первый один, хотя ... много чище. – AnApprentice

+0

последний - это рельсы 3-го пути ... если не ввести в объем. – DGM

+1

Согласитесь с DGM здесь, области отлично ... Permission.for (@user) .for (@project) .first хорош для чтения кода –

4

Попробуйте это:

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

Rails 3 путь с областями:

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

И тогда вы можете использовать его как:

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

Rails 4 вводит метод find_by:

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

Является ли этот синтаксис восприимчивым к SQL Injection? – csi

+1

Я тоже хотел бы знать это. Это немного запутанно, когда нормально использовать params [: attribute], а когда нет. – Augusto

+3

Это не поддается инъекции - единственный раз, когда вам угрожает инъекция SQL, когда вы интерполируете представленный параметр непосредственно в строку, предназначенную для использования в запросе - например, ModelName.where ("attribute = '# {params [ : атрибут]} ' ")'. Бывают случаи, когда вам нужен пользовательский запрос, который нельзя создать с помощью конструкторов запросов ActiveRecord, но в таких случаях вы можете использовать следующий синтаксис: «ModelName.where (« attribute =? », Params [: attribute])' –

Смежные вопросы