Sprawdzanie istnienia danych w tabeli przed dodaniem

Witam, mam tabele


create_table "addresses", force: :cascade do |t|
    t.string   "miasto"
    t.string   "ulica"
    t.string   "nr_domu"
    t.string   "nr_lokalu"
    t.string   "kod_pocztowy"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end
Do formularza wprowadzam dane: miasto, ulica, nr_domu, nr_lokalu, kod_pocztowy. Czy istnieje prosty sposób sprawdzania czy rekord z tymi danymi juz istnieje? I jeżeli istnieje to pobrać jego id, a jeżeli nie istnieje to go dodać i wtedy pobrać id.

Pewnie są lepsze rozwiązania, bo w sumie dopiero zaczynam, ale…

Może zrób dodatkowe pole w tabeli, w którym będzie połączony string z pięciu pozostałych kolumn (miasto+ulica+nr_domu+nr_lokalu+kod_pocztowy) i wymagaj unikalności w tej kolumnie :slight_smile:

@matics

  1. nie mieszaj nazw polskich i angielskich bo to nieciekawie wygląda

  2. poczytaj o metodzie first_or_create

Address.where(miasto: "...", ulica: "...", nr_domu: "...", nr_lokalu: "...", kod_pocztowy: "...").first_or_create

A ja mam takie pytanie.

Jak pobrać do where dane z formularza?


<%= form_for @supplier do |f| %>
    <%= f.label :surname, "Surname" %>
    <%= f.text_field :surname, class: "form-control" %>
    <%= f.label :name, "Name" %>
    <%= f.text_field :name, class: "form-control" %>
    <%= f.submit "Add", class: "btn btn-primary" %>
<% end %>

params[:supplier][:surname]
params[:supplier][:name]

ja bym tak spróbował :slight_smile:

Tak jakbyś tworzył nowy rekord, zakładając że @supplier to instancja klasy Supplier.

def safe_params
   params.require(:supplier).permit(name).permit(surname)
end

i wyszukaj

Supplier.where(safe_params)

@Milord

def safe_params
   params.require(:supplier).permit(name).permit(surname)
end

nie wygląda za elegancko

  1. w permit trzeba podać nie zmienne a stringi lub symbole
  2. w permit można podać kilka rzeczy po przecinku
  3. osobiście preferuje zamiast require używać fetch z drugim argumentem {} to pozwala nam na pominięcie obsługi jednego błędu wyrzuconego przez require, ale co do tego są różne szkoły
def safe_params
   params.fetch(:supplier, {}).permit(:name, :surname)
end

Dla jednej tabeli działa. Problem pojawia sie jak jest tabela addresses i supppliers i jest jeden formuarz dla obu tabel i najpierw trzeba sprawdzić czy dany adres juz istnieje jezeli tak to pobrac id a nastepnie sprawdzic czy dany dostawca istnieje i jezeli nie to dodac go a w miejsce adresses_id wstawic id adresu