2010-12-04 43 views
0
def self.search(search) 
    if search 
    where('name OR username OR bio LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 

上面的代码使用SQLite工作正常,我的开发服务器上,但由于Heroku的使用PostgreSQL的它打破了(看来你只能在真正的布尔查询使用“或” )。多列简单搜索从SQLite的到的Heroku/PostgreSQL的

有没有更好的方式来实现这个简单的搜索,所以它适用于PostgreSQL,还是我必须转移到更复杂的搜索解决方案?

+0

您是否在尝试查找具有(名称LIKE搜索)或(用户名LIKE搜索)或(bio LIKE搜索)的对象? – 2010-12-20 20:19:44

回答

1

你在找这样的吗?

def self.search(search) 
    if search 
    where('name IS NOT NULL OR username IS NOT NULL OR bio LIKE ?', "%#{search}%") 
    else 
    scoped 
    end 
end 

如果nameusername可以为空或空的,那么你就需要使用COALESCE:

def self.search(search) 
    if search 
    where("COALESCE(name, '') <> '' OR COALESCE(username, '') <> '' OR bio LIKE ?", "%#{search}%") 
    else 
    scoped 
    end 
end 

这些应该工作一样在SQLite和PostgreSQL的。

+0

我不知道那是哪种编程语言以及SQL文字如何翻译,但在字符文字中使用双引号不是PostgreSQL(和大多数其他DBMS)中的有效语法 – 2010-12-04 09:48:04