Formularz edycji tabeli z nested_attributes

Hej :slight_smile:

  • Tablica event zawiera szkolenia, na które można aplikować poprzez
    formularz.

  • Formularz aplikacyjny zawiera odpowiedzi na 3 pytania oraz
    zaznaczamy w nim, na które szkolenia chcemy zaaplikować, nadając im
    priorytety (na których zależy nam najbardziej). Przykładowy formularz
    wyśle paramtery:

    {“question1”=>“Odpowiedz1”, “question2”=>“Odpowiedz2”, “question3”=>“Odpowiedz3”, “entries_attributes”=>{“0”=>{“event_id”=>“1”, “priority”=>“1”}, “1”=>{“event_id”=>“2”, “priority”=>“2”}, “2”=>{“event_id”=>“3”, “priority”=>“3”}}}

  • Tablica applications zawiera id aplikacji i odpowiedzi uczestnika na
    3 pytania. Chęć pójścia na każde poszczególne szkolenie trafia do
    poszczególnego rekordu w tablicy entries (z przypisaniem go do danej
    aplikacji, dzięki accepts_nested_attributes_for).

  • Potem będzie można ocenić aplikacje po odpowiedziach na pytania i
    następnie przyjąć ludzi na poszczególne szkolenia, akceptując dany
    rekord w tablicy entries.

Modele wyglądają tak:

class Application < ActiveRecord::Base
  belongs_to :user
  has_many :entries, dependent: :destroy, inverse_of: :application
  has_many :events, through: :entries

  accepts_nested_attributes_for :entries, allow_destroy: true

  validates :question1, :question2, :question3, presence: true
  validates :user, presence: true, uniqueness: true
  validate :validate_uniqueness_of_events

  def validate_uniqueness_of_events
    events_id = Array.new
    entries.each { |entry| events_id.push(entry.event_id) }
    errors.add(:base, entries.inspect) if events_id != events_id.uniq
  end

class Entry < ActiveRecord::Base
  belongs_to :application, inverse_of: :entries
  belongs_to :event
  has_one :user, through: :application

  validates_presence_of :application

  validates :application, :event, :priority, presence: true
end

W tej chwili mam możliwość dodawania nowej aplikacji do bazy. Chciałbym, aby każdy użytkownik po jej dodaniu mógł sobie ją jeszcze przez jakiś czas edytować. Zastanawiam się w jaki sposób do tego powinienem podejść. Chodzi mi tutaj przede wszystkim o atrybuty nested.

Mogę zrobić formularz do edycji aplikacji, w którym będę podawał zmiany do tabeli entries:

{"question1"=>"Odpowiedz1", "question2"=>"Odpowiedz2", "question3"=>"Odpowiedz3", "entries_attributes"=>{"0"=>{"id" => 1, "event_id"=>"1", "priority"=>"4"}, "1"=>{"event_id"=>"4", "priority"=>"1"}}}

W powyższym przykładzie zmienię priorytet pierwszego szkolenia na 4 (bo podaję id dla rekordu entry) i zaaplikuje dodatkowo jeszcze na szkolenie o id 4. Mogę oczywiście też usuwać aplikację na dane szkolenie dzięki opcji “allow_destroy: true” w modelu.

Ale jakoś mi to wszystko nie gra, żeby wysyłać tylko zmiany w tabeli entries (z id dla entries, które edytuje, bez id tych które dodaje). Chyba jakoś przejrzyściej byłoby wysyłać po prostu pełną wersję tabeli entries dla danej aplikacji i wtedy jakoś w kontrolerze to zrobić, żeby zastąpić je w bazie (usunąć wszystkie stare i dodać nową wersję od nowa)? Ciężko mi powiedzieć które podejście jest “dobre” ?

Jest jakiś standard jak to powinno wyglądać?

Hej, wydaje mi się, że nested_attributes są na tyle “mądre”, że wystarczy, że w widoku zrobisz standardowy formularz, w akcji update dasz application.update_attributes(application_params) i wszystko powinno nadpisać się automatycznie prawidłowo.

Daj znać jeśli masz z tym jeszcze problem