在 SQlite3 和 PostgreSQL 中使用 Model 方法



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

所以,如果我写,

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

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

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

因此,我在谷歌上搜索了一下并找到了解决方案(Pgsql 错误:您可能需要添加显式类型转换)并相应地编辑了我的方法:

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

现在,它在预生产中工作得很好,但 SQlite 在开发中给了我一个错误,说:

"SQLite3::SQLException: unrecognized token: ":": SELECT "habits".* 从"习惯"到"习惯"。user_id" = ?和 (category_id::文本喜欢 '4')">

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

也许只有我,但 IMO 在包含整数的列上使用LIKE是没有意义的。因此,我只会使用普通=

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

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

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

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

Habit.search(params[:xyz])

你可以把一个条件放在

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

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

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

最新更新