2014-01-28 2 views
0

Я пытаюсь извлечь информацию из таблицы контактов на основе нескольких подобных условий. До сих пор я придумал следующее:Rails - где с несколькими подобными опциями

conditions = "" 
conditions << "email_address LIKE '%#{params[:email_address]}%'" unless params[:email_address].blank? 
conditions << " AND first_name LIKE '%#{params[:first_name]}%'" unless params[:first_name].blank? 
conditions << " AND last_name LIKE '%#{params[:last_name]}%'" unless params[:last_name].blank? 
conditions.sub!(/^AND/, '') 


if !conditions.blank? 
    @contacts = Contact.where(conditions).page(params[:page]).per(10) 
else 
    @contacts = Contact.all.page(params[:page]).per(10) 
end 

Что мне было интересно ... это лучший способ сделать это? Я бы подумал, что будет хороший способ добавить несколько условий в форме хэша и как-то указать, что я хочу использовать OR/AND и т.п.

Я довольно новичок в рельсах и google не очень помогает.

Спасибо.

ответ

1

Просто добавьте where вызовы непосредственно к сфере:

@contacts = Contact.scoped 

@contacts = @contacts.where("email_address LIKE '%?%'", params[:email_address]) if params[:email_address].present? 
@contacts = @contacts.where("first_name LIKE '%?%'", params[:first_Name]) if params[:first_name].present? 
@contacts = @contacts.where("last_name LIKE '%?%'", params[:last_name]) if params[:last_name].present? 

Вы можете использовать простой цикл, чтобы сделать его менее repetative:

%(email_address first_name last_name).each do |field| 
    @contacts = @contacts.where("#{field} like '%?%'", params[field]) if params[field].present? 
end 

И не строить запросы вручную напрямую подставляя ввод пользователя в строку запроса. Rails делает это очень сложно: вы обходите всю дезинфекцию Rails и открываете себе SQL-инъекцию.

Я бы подумал, что было бы неплохо добавить несколько условий в виде хэша и как-то указать, что я хочу использовать OR/AND и т.п.

Существует, но он работает только с AND и =:

@contacts.where(first_name: "bob", last_name: "smith") 
# select ... where first_name = 'bob' and last_name = 'smith' 
+0

Спасибо за подробный ответ. Это похоже на то, что мне нужно. Однако я получаю сообщение об ошибке. неопределенный метод 'scoped '. Можете ли вы просматривать области (как в режиме просмотра базы данных)? Таблица контактов фактически представляет собой представление в другую базу данных. –

+0

['scoped'] (http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scoped) - это простой метод для моделей и ассоциаций ActiveRecord, существовавших с Rails 3, если« Contact »наследует от ActiveRecord :: Основание должно отвечать на 'scoped'. В противном случае вы можете просто использовать '@contacts = Contact' вместо инициализации – meagar

+0

Я довольно новичок в рельсах, поэтому до сих пор не знал об этом :) Это, похоже, не работает. Я думаю, потому что Contact - это представление в базе данных. Мысли? Я реализовал его так же, как вы написали. –

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