没有操作员匹配PG支持的Rails应用中的给定名称和参数类型



首先,我使用 sqlite 作为数据库实现了示例搜索功能。

查询如下:

@productions = Production.where('productions.status like ?', "%#{params[:filter]}%") 这很好。我能够根据状态过滤记录。

现在,我在一个较大的应用程序上实现相同的逻辑,唯一的区别是它由 PostgreSQL

支持

逻辑

@ride_later_requests = RideLaterRequest.where('ride_later_requests.status like ?', "%#{params[:filter]}%") 当我点击过滤器这次时,我有一些错误说

LINE 1: ...later_requests" WHERE (ride_later_requests.status like '%8%'...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "ride_later_requests".* FROM "ride_later_requests" WHERE (ride_later_requests.status like '%8%')):

我在这里做错了什么?这与PG有关吗?请帮助解决此问题。

架构

create_table "ride_later_requests", force: :cascade do |t|
    t.string   "customer_name"
    t.integer  "status"
end

RideLaterRequest.RB

enum status:{
    UnderConstruction:1,
    Submitted: 2,
    Unfulfilled:3,
    QuotesReady:4,
    Fulfilled: 5,
    Rejected:6,
    Ignored:7,
    Cancelled:8,
    Expired:9
  }

对于它的价值,我有两件事:

  1. 尽管ActiveRecord#where确实进行了输入消毒,但在达到DB调用之前,验证您的params通常是很好的做法。
  2. 在两种情况下,我在调用DB时都不会看到使用like操作员的值。看来您将状态锁定在enum值中,因此您应该可以做Production.where('status IS ?', params[:filter])

我认为您也可以这样做:

Production.where("status = ?", params[:filter])

最新更新