существует? Ruby Postgresql Активная проверка записи с несколькими условиями - PullRequest
0 голосов
/ 17 января 2020

Хочу, сравните, если эти два параметра существуют в базе данных с тем же идентификатором регистра.

Пример:

Data.all вернет это.

phone_number | adress
12345678     | route 66

При проверке, если ниже, вернуть true для всех параметров.

My If с активной записью:

 if Data.exists?(phone_number: "#{params["phone_number"]}", adress: "#{params["adress"]}")
   puts "true, it's registered"

 else
  puts "false not, registered."
  Data.create!(phone_number: "#{params["phone_number"]}", adress: "#{params["adress"]}")

 end

если выше, вернуть false для нового выберите из двух параметров

пример:

Data.all вернет это.

phone_number | adress
95654152   | route 67

Создать регистр новый регистр с параметрами, а не дубликат.

Можете ли вы мне помочь? как я уже писал, он проверяет только 1 условие, а не 2 параметра.

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Использовать активную запись #find_or_create_by. Вы можете проверить документацию здесь https://apidock.com/rails/v4.0.2/ActiveRecord/Relation/find_or_create_by

Data.find_or_create_by(phone_number: params[:phone_number], adress: params[:adress])
0 голосов
/ 18 января 2020

Простым решением может быть использование метода ActiveRecord#find_or_create_by, который возвращает существующую запись или генерирует новую, если она еще не существует:

Data.find_or_create_by(phone_number: params["phone_number"], adress: params["adress"])

Обратите внимание, что нет необходимо использовать интерполяцию строк ("#{ ... }") в этом случае. Или даже короче:

Data.find_or_create_by(params.permit(:phone_number, :adress))

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

Я предлагаю добавить 1014 * подтверждение к модели

# in app/models/data.rb
validates :phone_number, uniqueness: { scope: :adress, case_sensitive: false }

и уникальный индекс к базе данных

add_index :datas, [:phone_number, :adress], unique: true

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

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