在我的 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/