Hej
-
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ć?