ruby-on-rails - 在 SQlite3 和 PostgreSQL 中使用模型方法

标签 ruby-on-rails ruby postgresql sqlite

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

所以,如果我写,

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

它在开发中工作得很好,但 PostgreSQL 在生产中给出了 500 错误:

"No operator matches the given name and argument type(s). You might need to add explicit type casts."

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

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

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

"SQLite3::SQLException: unrecognized token: ":": SELECT "habits".* FROM "habits" WHERE "habits"."user_id" = ? AND (category_id::text LIKE '4')"

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

最佳答案

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

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

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

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

可以像这样从你的 Controller 中调用:

Habit.search(params[:xyz])

关于ruby-on-rails - 在 SQlite3 和 PostgreSQL 中使用模型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44553424/

相关文章:

ruby-on-rails - 如何阻止用户在过去的 DateTime Ruby 中进行预订?

ruby - 交互式 Ruby 子 shell 有什么意义?

ruby-on-rails - 如何使用 Rails 在浏览器中查看电子邮件 View

ruby-on-rails - 如何显示唯一的实例方法?

ruby-on-rails - 合并两个ActiveRecord数组并按created_at排序

ruby - Rails 将图像添加到帖子

ruby,如何找到数组的所有元素都在日期范围内

sql - 如何从该表中的每个不同用户中选择最高分数?

postgresql - 如何从错误消息中确定 PostgreSQL 错误代码

java - 传递日期参数以创建日期范围查询