2011-09-07 71 views
0

我最近推了一个Rails 3.1应用程序到heroku。在本地,一切正常,但在实时应用程序中,搜索功能被破坏。Heroku搜索破 - 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关键字比SQLite的LIKE不同。 SQLite中的LIKE是PostgreSQL中的ILIKE。可以使用正确的关键字或者比较结果。

  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。