当我尝试在我的模型上为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或使用其他地图宝石jsonb_accessor
,它也无法正常工作答案 0 :(得分:1)
我创建了一个repo,验证了您的范围是否有效。
https://github.com/JuanitoFatas/rails-5-jsonb/commit/fb60e12bda07504ad71efe5c78aa1918661d353c
也许试试这些:
rails db:drop db:create db:migrate
)