Rails Postgresql JSONB столбец проверяет, было ли изменено значение ключа? - PullRequest
0 голосов
/ 28 февраля 2020

Учитывая, что у меня data_config как столбец jsonb

Я хочу проверить значение параметра c key , если оно было изменено перед сохранением.

Тестовые данные:

data_config: {
  "status"=>true,
  "text"=>"sample"
}

Модель рельсов:

 attr_json_config(default_container_attribute: :data_config)
 attr_json :status, :boolean, default: true

 before_save :check_config

 def check_config
   if self.status_changed? # => want to have something like this to check if value changed?
      # ... do something
   end
 end

Это работает в моем случае, но я считаю, что есть лучший способ.

status_val = self.attr_json_changes.changes_to_save.try(:[], "status")
# above returns [true, false] (old & new value)

if status_val.try(:first) != status_val.try(:last)
  ...do something
end

1 Ответ

0 голосов
/ 28 февраля 2020

Почему бы вам не сравнить параметры с текущим значением?

Поскольку вы предоставляете очень мало информации, я предполагаю, что вы захотите изменить другой ключ в jsonb, если статус изменился. В этом случае вы должны сделать вашу запись неизменной до того, как обновленное значение будет готово к фиксации.

Итак, в вашем контроллере это должно быть так:

class MyController < ApplicationController
  def update
    if params[:data_config][:status] != @model.['data_config']['status'] # check if value change
      # ... do something
      new_params = do_something
    end

    if @model.update(new_params)
      # render success
    else
      # render failed
    end
  end
end

Я надеюсь, что такой подход может помочь вам.

...