从Rails 5模型访问jsonb列和属性

时间:2016-08-31 19:20:35

标签: ruby-on-rails postgresql ruby-on-rails-5 jsonb

当我尝试在我的模型上为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

,它也无法正常工作

1 个答案:

答案 0 :(得分:1)

我创建了一个repo,验证了您的范围是否有效。

https://github.com/JuanitoFatas/rails-5-jsonb/commit/fb60e12bda07504ad71efe5c78aa1918661d353c

也许试试这些:

  • 在可能影响此
  • 的gems GitHub页面上搜索jsonb问题
  • restart rails console
  • 重新创建数据库(rails db:drop db:create db:migrate
  • 重新启动计算机