【问题标题】:Accessing jsonb column and attributes from a Rails 5 Model从 Rails 5 模型访问 jsonb 列和属性
【发布时间】: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


【解决方案1】:

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

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

不妨试试这些:

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

【讨论】:

  • 不错!我正在将 json 保存到该商店。这就是为什么我使用类似 storext 的东西。它适用于Car.create(financing_offer: {"down_payment" =&gt; "1000"}),但不适用于Car.create(financing_offer: {"down_payment" =&gt; "1000"}.to_json)
  • 谢谢。我几乎可以肯定是 storext 导致了这种情况。我在这里打开了一个问题:github.com/G5/storext/issues/31,如果你想在你的虚拟应用程序中跟进或复制问题。
猜你喜欢
  • 1970-01-01
  • 2011-11-19
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
相关资源
最近更新 更多