Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > Поиск в базе


Автор: Лена 21.9.2009, 20:36
Научите, пожалуйста, как организовать поиск в базе.
Думаю, что надо делать примерно так:
Код

<% form_tag :action => :find_tovar do  %>
  <label for ="title">Поиск:</label><br/>
  <%= text_field_tag :title, '', :size=>15 %>
  <%= submit_tag "Найти" %>
 <% end %>


В контролере:

Код

def find_tovar
    param = params[:title] 
    @tovary = Product.find(:all, :conditions => ["title like ?", "#{param}%"])
     if @tovary.empty?
       redirect_to_index("Указанного товара нет") 
     end
end


Создала представление find_tovar. 
Захожу на страницу. Ничего не ввожу в поле, жму кнопку "Найти" и попадаю в представление find_tovar. По идеи должно срабатывать redirect_to_index...
Подскажите, пожалуйста, как правильно все же передать значение из поля в метод find_tovar
?

Автор: source777 21.9.2009, 22:49
Цитата(Лена @  21.9.2009,  20:36 Найти цитируемый пост)
Захожу на страницу. Ничего не ввожу в поле, жму кнопку "Найти" и попадаю в представление find_tovar. По идеи должно срабатывать redirect_to_index...

Лена, а тебе не кажется что при пустом params[:title] будет выполнен запрос:
Код

SELECT * FROM products WHERE title LIKE '%'

?

А сей запрос вернёт все имеющиеся продукты, так что всё у тебя работает. Поздравляю.

P.S. Кстати очень рекомендую воспользоваться отличным готовым решением для поиска средствами СУБД: http://github.com/binarylogic/searchlogic.


С ним твой метод будет примерно таким:
Код

def find_tova
    @tovary = Product.title_like(params[:title])
    redirect_to_index("Указанного товара нет")  if @tovary.empty?
end


хотя лучше бы

Код

def find_products
    @products = Product.title_like(params[:title])
    redirect_to_index("Указанного товара нет")  if @products.empty?
end



Автор: Лена 21.9.2009, 23:28
Большое спасибо за рекомендацию и помощь! smile 
Без searchlogic теперь у меня пока новый вариант. Похоже, что работает. smile 
Код

def find_tovar
    param = params[:title] 
    if param.empty?
      redirect_to_index("Введите название товара")
    end
    @tovary = Product.find(:all, :conditions => ["title like ?", "#{param}%"])
     if @tovary.empty?
       redirect_to_index("Указанного товара нет") 
     end
    
end




Автор: source777 23.9.2009, 19:11
Всегда пожалуйста.
Но всё-таки рекомендую обратить внимание на SearchLogic, в более сложных случаях он здорово упрощает код.

Цитата(Лена @  21.9.2009,  23:28 Найти цитируемый пост)
    if param.empty?
      redirect_to_index("Введите название товара")
    end

Лучше if param.blank? 
чтобы предусмотреть случай отсутствия params[:title] и как следствие param == nil.

Автор: Лена 24.9.2009, 17:19
Цитата(source777 @  23.9.2009,  19:11 Найти цитируемый пост)
чтобы предусмотреть случай отсутствия params[:title] и как следствие param == nil.


Мне это не совсем понятно. Как может отсуствовать params[:title]? Мы же здесь инициализируем:
<%= text_field_tag :title, '', :size=>15 %>

Автор: source777 24.9.2009, 20:16
Цитата(Лена @  24.9.2009,  17:19 Найти цитируемый пост)
Как может отсуствовать params[:title]? 

Легко:
1) пользователь совершает поиск
2) происходит POST-запрос к твоему приложению
3) пользователь видит результат поиска
4) пользователь сохраняет страницу с результатами поиска в закладки
5) пользователь отрывает страницу из закладок
6) пользователь видит 500-ую ошибку сервера

Автор: Лена 26.9.2009, 14:27
Спасибо. Теперь понятно. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)