ruby-on-rails - 从 Rails 5 模型访问 jsonb 列和属性

标签 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用于 AR 映射的 gem、Rails 5、postgresql 9.4.5。如果我不使用 storext 或我使用另一个映射 gem,它也不起作用 jsonb_accessor

最佳答案

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

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

也许试试这些:

  • 在可能影响此问题的 gems GitHub 页面上搜索 jsonb 问题
  • 重启 Rails 控制台
  • 重新创建数据库(rails db:drop db:create db:migrate)
  • 重启电脑

关于ruby-on-rails - 从 Rails 5 模型访问 jsonb 列和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39257462/

相关文章:

ruby-on-rails - Rails4 与 Foundation Icon Fonts 2 gem

ruby-on-rails - View 和 Controller 外部的 Rails Engine RouteProxy

postgresql - 无法使用 pg_dump PostgreSQL 备份超表 TimescaleDB 数据库

javascript - 如何通过sequelize postgres数据库和迁移在服务器重启后幸存下来

ruby-on-rails - 终端重启后路由丢失。 rails 5.0.1

ruby-on-rails - ActionCable:每个用户一个 channel

ruby-on-rails - 搜索没有最后一个的事件记录

ruby-on-rails - Rails 错误 - 未初始化的常量

ruby-on-rails - Rails 4 嵌套形式 "Unpermitted Parameters"在其他任何地方都没有回答

sql - 将多维数组转换为记录