[英]Ruby on Rails: Query in model for SQLite in Dev => PostgreSQL in Prod
我目前在Heroku的開發環境中運行SQLite,在生產環境中運行PostgreSQL。
我當前的搜索功能在模型entry.rb中具有以下方法:
def self.search(search)
where("content LIKE ? OR created_at LIKE ?", "%#{search}%", "%#{search}%")
end
盡管這可能在我運行SQLite的開發環境中可行,但運行PostgreSQL的Heroku拋出了錯誤。
我知道以下事實:在不同的環境中運行不同的數據庫是一種不好的做法,但是,為了簡化管理,現在我會堅持使用它。
話雖如此,我想知道PostgreSQL的正確查詢是什么樣的?
另外,是否可以在模型中添加if子句來根據我所處的環境提供一個查詢或另一個查詢? 喜歡:
if Rails.env.development?
# SQLite query
else
# PostgreSQL query
end
多謝你們!
您正在嘗試將LIKE
(字符串運算符)與時間戳一起使用,PostgreSQL會對此抱怨,這是正確的。 這將與SQLite一起使用,因為SQLite實際上沒有時間戳類型,它使用ISO-8601格式的字符串作為時間戳。 這是您的第一個問題。
第二個問題是您要嘗試使用帶有時間戳的字符串模式匹配運算符。 除非您期望人們輸入'2016-01'
來查找在2016年1月發生的事情,否則這對我來說沒有多大意義。如果這確實是您想要執行的操作,則可以將時間戳記字符串:
where('content like :pat or cast(created_at as text) like :pat', :pat => "%#{search}%")
或使用to_char
根據需要格式化時間戳記(有關可用的格式化選項,請參見手冊):
where("content like :pat or to_char(created_at, 'YYYY-MM-DD HH24:MI:SS.MS') like :pat", :pat => "%#{search}%")
您可能還會注意到,我從位置占位符( ?
)切換到命名占位符( :pat
),從而不必重復自己。
不要嘗試在不同的環境中使用不同的查詢。 那只是讓自己頭疼很多。 而是在開發環境中安裝PostgreSQL,以便您可以使用同一數據庫進行開發,測試和部署。 如果您未在所有三個地方都使用相同的數據庫,那么這個小問題將是您最少的擔心。 ActiveRecord無法為您提供任何有用的數據庫可移植性,因此您可以自己動手做,也可以在各處使用同一數據庫。
在這種情況下,您可以使用ILIKE 。
def self.search(search)
where("content ILIKE ? OR created_at ILIKE ?", "%#{search}%", "%#{search.to_datetime}%")
end
根據postgres文檔:
根據活動的語言環境,可以使用關鍵字ILIKE代替LIKE來使匹配不區分大小寫。 這不是SQL標准,而是PostgreSQL擴展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.