WedX - журнал о программировании и компьютерных науках

Обновить, если есть, иначе ничего не делать?

Я пытаюсь обновить значение модели тогда и только тогда, когда модель существует. Если это не так, я ничего не делаю. Поиск только вроде возвращает обновление или создает вопросы/ответы, а создавать не хочет.

Я знаю, что могу сделать это с помощью простого:

found = Model.find_by_id(id)
if found
  update stuff
end

Однако мне кажется, что есть способ сделать это за один вызов, не присваивая временные локальные значения и не выполняя оператор if.

Как мне написать вызов rails для обновления записи без шумных ошибок, если она не существует?

Последняя версия Rails 3.x

20.03.2013

  • Когда вы говорите, если модель существует, вы имеете в виду, что хотите определить, определяет ли приложение модель или у вас уже есть определенные данные в базе данных? 21.03.2013
  • Если у меня уже есть какие-то конкретные данные в БД. 21.03.2013
  • Например: у меня есть запись customer_help_visits, если клиент посетил страницу справки. Когда клиент посещает главную страницу, его поле customer_help_visits обновляет значение last_browsed. Не у всех клиентов есть customer_help_visits. Это не моя фактическая структура, я понимаю, насколько глупой кажется эта архитектура - это просто то, что я могу придумать в качестве примера, не говоря конкретно о моем фактическом коде:] 21.03.2013

Ответы:


1

Вы можете использовать метод try Rails перед вызовом update_attributes в результате find_by_id или where.

try вернет nil молча, не вызывая исключения, если запись не существует. Если запись существует, он обновит ее.

found = Model.find_by_id(id).try(:update_attributes, {key: value})
21.03.2013

2

Вы можете использовать first_or_initialize в сочетании с new_record? следующим образом:

client = Client.where(first_name: 'Nick').first_or_initialize(locked: false)
client.save unless client.new_record?
20.03.2013
  • Я не хочу создавать, если его не существует. 21.03.2013
  • это именно то, что делает unless new_record? 21.03.2013

  • 3

    Предполагая, что ваша модель называется «Событие» и вы выполняете поиск по идентификатору, вы можете сделать:

    e = Event.where(:id => id)
    if !e.empty?
      e.first.value = new_value
      e.first.save!
    end
    
    20.03.2013
  • Извините, я должен был уточнить: мне интересно, есть ли команда rails а-ля update_attributes_if_exists. 21.03.2013

  • 4

    В Rails 4 это, пожалуй, самое простое решение, которое я нашел:

    # POST /users
    # POST /users.json
    def create
      @user = User.find_or_initialize_by(fbid: user_params[:fbid])
      @user.assign_attributes(user_params)
      respond_to do |format|
        if @user.save
          format.html { redirect_to @user, notice: 'User was successfully created.' }
          format.json { render action: 'show', status: :created, location: @user }
        else
          format.html { render action: 'new' }
          format.json { render json: @user.errors, status: :unprocessable_entity }
        end
      end
    end
    

    Если пользователь с FBID существует, то запись будет обновлена; в противном случае будет создан новый. Вы можете обновить запись, чтобы она соответствовала любому столбцу, который вы хотите сохранить уникальным. Вероятно, индексация столбца поможет поиску и поиску и т. д.

    Надеюсь это поможет!

    19.04.2014
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]