2010-12-04 83 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