在SQlite3和PostgreSQL中使用Model方法

时间:2017-06-14 19:43:24

标签: ruby-on-rails ruby postgresql sqlite

在我的Rails应用程序中,我确实有SQlite3用于开发,而PostgreSQL用于生产。我有一个属于类别和类别的习惯类有很多习惯。因此,为了让用户搜索任何类别以查看相关习惯,我在习惯模型中开发了一个类方法,该方法进入数据库并根据搜索的类别找到所有习惯。

所以,如果我写,

def self.search(search)
  where("category_id LIKE ?", search)
end

它在开发中运行得非常好,但PostgreSQL在生产中给出了500错误说:

  

"没有运算符匹配给定的名称和参数类型。你可能会   需要添加显式类型转换。"

所以,我搜索了它并找到了解决方案(Pgsql error: You might need to add explicit type casts)并相应地编辑了我的方法:

def self.search(search)
  where("category_id::text LIKE ?", search)
end

现在,它在预制方面完美无缺,但是SQlite在开发中给我一个错误说:

  

" SQLite3 :: SQLException:无法识别的令牌:":":SELECT"习惯"。*   来自"习惯"习惯"。" user_id" =? AND(category_id :: text LIKE   ' 4')"

尝试了很多,但无法解决这个问题。有什么办法可以修改这个方法来处理这两个数据库吗?或者有什么方法可以告诉我的应用程序在哪种环境中使用哪种方法?

3 个答案:

答案 0 :(得分:2)

也许只是我,但IMO没有必要在包含整数的列上使用LIKE。因此,我只会使用正常的=

def self.search(search)
  where("category_id = ?", search)
end

因为这不遵循常见的Rails习惯用法,让我们用哈希语法将其简化为where并使用范围而不是类方法:

scope :search, ->(search) { where(category_id: search) }

可以从控制器中调用,如下所示:

Habit.search(params[:xyz])

答案 1 :(得分:1)

你可以在

上加上条件
ActiveRecord::Base.connection.instance_values["config"][:adapter]

if ActiveRecord::Base.connection.instance_values["config"][:adapter] == "postgresql"
  puts "I'm using postgres!"
elsif ActiveRecord::Base.connection.instance_values["config"][:adapter] == "sqlite3"
  puts "I'm using sqlite!"
end

答案 2 :(得分:0)

让数据库适配器为您完成工作

def self.search(search)
  where(category_id: search)
end