【发布时间】:2016-08-31 19:20:35
【问题描述】:
当我尝试在我的模型上为访问 jsonb 中的内容的模型创建一个范围时,我遇到了一个奇怪的问题。我的查询看起来不错,但即使我很确定它们存在,它似乎也找不到任何记录!
阅读postgresql docs后,下面的代码应该可以工作了。
谁能发现问题?
scope :financing_offer_eq, ->(field, value) do
where(
"cars.financing_offer->>:field = :value",
field: field,
value: value
)
end
输出
Car.financing_offer_eq(:down_payment, '10000')
Car Load (0.5ms) SELECT "cars".* FROM "cars" WHERE (cars.financing_offer->>'down_payment' = '10000')
=> []
这是一辆样车
[132] pry(main)> Car.find(15).financing_offer
Car Load (0.5ms) SELECT "cars".* FROM "cars" WHERE "cars"."id" = $1 LIMIT $2 [["id", 15], ["LIMIT", 1]]
=> {"amount_of_loan"=>"10000", "total_amount"=>"10000", "total_cost"=>"10000", "borrowing_rate"=>"1.2", "annual_percentage_rate"=>"1.2", "monthly_payment"=>"1.2", "down_payment"=>"10000"}
#<Car:0x007fea76ebf358
id: 15,
...
removed irrelevant attributes
...
financing_offer: {"amount_of_loan"=>"10000", "total_amount"=>"10000", "total_cost"=>"10000", "borrowing_rate"=>"1.2", "annual_percentage_rate"=>"1.2", "monthly_payment"=>"1.2", "down_payment"=>"10000"}>
还尝试在控制台中运行查询:
Car.where("financing_offer ->>'{down_payment}' = '10000'")
Car Load (0.4ms) SELECT "cars".* FROM "cars" WHERE (financing_offer ->>'{down_payment}' = '10000')
=> []
Car.where("financing_offer ->> 'down_payment' = :value", value: '10000')
Car Load (0.4ms) SELECT "cars".* FROM "cars" WHERE (financing_offer ->> 'down_payment' = '10000')
=> []
Car.where("financing_offer ->> 'down_payment'= '10000'")
Car Load (0.5ms) SELECT "cars".* FROM "cars" WHERE (financing_offer->>'down_payment'= '10000')
=> []
Car.where('financing_offer @> ?', {down_payment: '10000'}.to_json)
Car Load (1.9ms) SELECT "cars".* FROM "cars" WHERE (financing_offer @> '{"down_payment":"10000"}')
=> []
如果有什么不同,我将使用 Storext gem 进行 AR 映射、Rails 5、postgresql 9.4.5。如果我不使用 storext 或者我使用另一个映射 gem jsonb_accessor
,它也不起作用【问题讨论】:
-
能否发布一些本次查询应该选择的记录的数据?
-
我发布了一辆汽车,但它有很多不相关的属性,我删除了。不知道这有什么帮助:)
-
我只是想看看这些值是 json-integer 类型还是纯字符串。谢谢!
-
你是对的!对不起。都是字符串
标签: ruby-on-rails postgresql ruby-on-rails-5 jsonb