没有运算符匹配pg支持的rails应用程序中给定的名称和参数类型

时间:2017-12-01 16:34:06

标签: ruby-on-rails postgresql

首先,我使用 SQLITE 作为数据库,在rails应用中实现了一个示例搜索功能。

查询如下:

@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 个答案:

答案 0 :(得分:3)

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

  1. 虽然ActiveRecord#where确实输入了清理功能,但在params到达数据库呼叫之前验证您的like通常是一种很好的做法。
  2. 在任何一种情况下,在调用数据库时,我都没有看到使用enum运算符的值。您似乎将状态锁定在Production.where('status IS ?', params[:filter])值中,因此能够执行Production.where("status = ?", params[:filter])
  3. 我认为你也可以这样做:

    reduce(lambda x,y:x*10+y,[10,20])