2011-09-07 3 views
0

Я недавно нажал приложение Rails 3.1 на герою. Локально все работает нормально, но в реальном приложении функция поиска нарушена.Heroku Search Broken - Rails 3.1

Модель:

def self.search(search) 
    if search 
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"]) 
    else 
    find(:all) 
    end 

конец

Вид:

<%= form_tag apps_path, :method => 'get', :id => "search" do %> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "Search", :name => nil, :class => "search-button" %> 
<% end %> 

Контроллер:

def index 
    @apps = App.search(params[:search]) 
    @number_of_apps = @apps.count 
end 

У меня такое ощущение, что это связано с тем, что моя локальная настройка работает на SQLite3, а установка Heroku использует PostgreSQL.

Любая помощь приветствуется. :)

ответ

3

Обратите внимание: Postgres, как и сопоставление, зависит от регистра. Попробуйте использовать ILIKE вместо LIKE

+2

, который подтверждает одну из моих мантр - создайте ту же платформу БД, к которой вы будете развертываться! Или, по крайней мере, протестируйте его перед развертыванием. –

+0

Большое спасибо за совет :) Это сработало, вы бы порекомендовали какие-либо конкретные драгоценные камни для более продвинутых функций поиска? – Ammar

+0

Вы должны взглянуть на [возможности полнотекстового поиска Postgres] (http://www.postgresql.org/docs/9.0/static/textsearch.html) – dexter

3

Есть две проблемы:

  1. PostgreSQL LIKE ключевое слово отличается LIKE в SQLite. LIKE в SQLite - ILIKE в PostgreSQL. Либо используйте правильное ключевое слово или нижнее значение для сравнения.

  2. find(:all) был устаревшим с 2.3 и должен был быть удален в 3.1. Пожалуйста, используйте метод #all.

    def self.search(query) 
        if query 
        where('name LIKE ?', "%#{query}%").all 
        else 
        all 
        end 
    end 
    

    Еще лучше, верните область, чтобы воспользоваться ленивой загрузкой.

    def self.search(query) 
        if query 
        where('name LIKE ?', "%#{query}%") 
        else 
        self 
        end 
    end 
    
0

Вы можете использовать Texticle gem. Он очень прост в установке и прекрасно работает с Heroku, но вам нужно использовать PostgreSQL.