Не удается обновить атрибут в методе проверки - Rails - PullRequest
0 голосов
/ 19 марта 2019

Не совсем комфортно с активной записью

Интересно, можно ли обновить атрибут модели из другого, например так:

validate :check_if_exist?

def check_if_exist?
    events = Event.where(kind: kind, starts_at: starts_at..ends_at).or(Event.where(kind: kind, ends_at: starts_at..ends_at))
    unless events.count == 0
        events[0].update_attribute(:starts_at, starts_at)
        events[0].update_attribute(:ends_at, ends_at)
        errors.add(:base, "Event ID##{events[0].id} updated")
        return false
    end
end

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

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Использование first_or_initialize

event = Event.where(kind: kind, starts_at: starts_at..ends_at).or(Event.where(kind: kind, ends_at: starts_at..ends_at)).first_or_initialize
event.update(starts_at: starts_at, ends_at: ends_at)
1 голос
/ 19 марта 2019

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

class Event < ApplicationRecord
  attr_accessor :flash_notice
  before_create :terminate_existing

  def terminate_existing
    existing = Event.find_by(kind: kind, starts_at: starts_at..ends_at).or(find_by.where(kind: kind, ends_at: starts_at..ends_at))
    existing.update(starts_at: starts_at, ends_at: ends_at)
    flash_notice = "Event ID# #{existing.id} updated"
  end
end

EventsController

after_action :flash_notice, only: :create

def flash_notice
  unless @event.flash_notice.blank?
    flash[:notice] = @event.flash_notice
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...