簡體   English   中英

Ruby on Rails:在開發人員模型中查詢SQLite => Prod中的PostgreSQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM