Как обновить один атрибут при изменении другого - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок в Rails и могу понять это правильно.

Пытаюсь обновить "complete_at", когда "complete" становится истинным.

Я прочитал это: https://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-changed-3F

И решил добавить колбэк при каждом обновлении или сохранении.Затем проверьте, изменился ли «завершенный» объект, если нет, если это правда, обновите «завершенный_at» до текущей даты.

Метод «check_is_completed» действительно вызывается, но я не могу получить доступ кисправьте реквизиты и определите, изменились ли они, и получите новое значение

class Task < ApplicationRecord
  belongs_to :user
  validates :name, presence: true

  after_save :check_is_completed
  after_update :check_is_completed

  private 

  # This gets called
  def check_is_completed
    # try 1
    # This does not work called
    if @completed.changed?
      if @completed == true
      self.completed_at = Date.new()
      end
    end
    #try 2
    if self.completed_changed?
      if self.completed == true
      self.completed_at = Date.new()
      end
    end
  end
end

1 Ответ

0 голосов
/ 27 ноября 2018

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

Изменить

  after_save :check_is_completed
  after_update :check_is_completed

На

  before_save :check_is_completed

ВыТакже не нужно использовать какие-либо переменные экземпляра.Поскольку вы уже в своем классе, все, что вам нужно сделать, это:

def check_is_completed
  return unless completed_changed?
  self.completed_at = Date.new() if completed?
end

Это выполнит проверку перед каждым сохранением, ничего не делая, пока не будет изменен завершенный атрибут, а затем только обновит поле complete_atесли выполнено, верно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...