Предложите варианты, если запись уже существует в Ruby on Rails - PullRequest
0 голосов
/ 16 ноября 2018

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

99% времени, продукт должен иметь уникальный код продукта, ноиногда это не будет иметь место, когда пересмотренная версия выйдет с тем же кодом продукта.

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

Я пытаюсь добиться этого в контроллере, но не могу получить синтаксиссуществует?метод правильный.Может кто-нибудь указать, где я иду не так, пожалуйста?

def create
    @product = Product.new(product_params)

    if Product.product_code.exists?(@product.product_code)
        render 'new'
        flash[:error] = "This product already exists."

    elsif @product.save
        redirect_to @product
    else
        render 'new'
    end

end

Ответы [ 2 ]

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

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

Это будет продолжать отправлять пользователя обратно в форму:

def create
  @product = Product.new(product_params)
  if Product.exists?(product_code: @product.product_code)
    render 'new'
    flash[:error] = "This product already exists."
  elsif @product.save
    redirect_to @product
  else
    render 'new'
  end
end

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

class Product < ApplicationRecord
  attribute :dup_warning, :boolean, default: true
  validate :lax_product_code_uniquenes

  def lax_product_code_uniqueness
    if new_record? && !dup_warning && Product.exists(product_code: self.product_code)
      errors.add(:product_code, 'is not unique - are you sure?')
      self.dup_warning = true
    end
  end
end

Затем добавьте виртуальный атрибут в форму:

<%= form_with(model: @product) do |f| %>
  ...
  <%= f.hidden_input(:dup_warning) %>
  ...
<% end %>

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

def create
  @product = Product.new(product_params)
  if @product.save
    redirect_to @product
  else
    render 'new'
  end
end

def product_params
  params.require(:product)
        .permit(:foo, :bar, :product_code, :dup_warning)
end
0 голосов
/ 16 ноября 2018

Вместо if Product.product_code.exists?(@product.product_code) возможно, вам следует использовать if @product.product_code.present?

UPD: спасибо всем, прокомментировано ниже.

Правильное использование exists? равно Product.where(product_code: @product.product_code).exists?

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