基于jsonb嵌套数据字段查找模型

时间:2017-09-15 00:24:31

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

我使用Ruby on Rails和Postgres 9.5。

在数据库中,我有一个名为events的表。

我想根据数据字段中的特定值查找所有事件。

events.data具有以下可能的json值:

{ 'transition' => { 'from' => 'bacon', 'to' => 'ham' } }

如何构建一个查找具有data =>的事件的查询? transition =>来自bacon

1 个答案:

答案 0 :(得分:2)

假设您的模型名为Event,您可以这样做:

Event.where("data -> 'transition' ->> ? = ?", 'from', 'bacon')

Here is jsonb operators reference.

此查询将返回data.transition.from等于bacon的所有事件。

要干掉您的查询,您可以将其添加到存储库,例如:

# app/repositories/event_repository.rb

module EventRepository
  extend ActiveSupport::Concern

  included do
    scope :where_transition, ->(field, value) { where("data -> 'transition' ->> ? = ?", field, value) }
  end
end

之后将其包含在您的模型中:

include EventRepository

然后你可以像这样使用它:

Event.where_transition('from', 'bacon')
Event.where_transition('to', 'ham')