V mojej aplikácii Rails majú moje kapely veľa udalostí.Z pohľadu kapiel môže ukázať, aké udalosti majú. Môj problém je, že ak sa vytvorí nové pásmo, spôsobí to chybu v zobrazení, pretože nemá udalosť.
Čítal som o allow_nil a chcel som ho použiť v mojom modeli kapiel, ale nie som si istý, ako to implementovať. Dokumentácia k nej je dosť suchá a nie je naozaj užitočná
class Band < ApplicationRecord
has_many :events :allow_nil true
end
Nie som si istý, či je vyššie uvedený postup správny.
odpovede:
0 pre odpoveď č. 1Koľajnice 5.x
Myslím, že hľadáte optional: true
, ale musí sa pridať do súboru belongs_to
strane združenia, napríklad takto:
class Event < ApplicationRecord
belongs_to :band, optional: true
end
Koľajnice 4.x
Koľajnice 4 umožňujú nil
v predvolenom nastavení pre akékoľvek združenie, stačí odstrániť všetky potrebné validácie band_id
prítomnosť.
-1 pre odpoveď č. 2
Mám podozrenie, že to, čo požadujete (overenie údajov na úrovni ActiveRecord u pridružených modelov), nie je váš problém. Vaša pôvodná otázka je o allow_nil
ale uvádzate, že (s dôrazom na mňa):
Z pohľadu kapiel môže ukázať, aké udalosti majú. Môj problém je, že ak sa vytvorí nové pásmo, spôsobí to chybu v zobrazení, pretože nemá udalosť.
Pravdepodobne sa snažíte zobraziť zoznam udalostí ich opakovaním pomocou .each
, ale keďže zbierka udalostí neexistuje .each
chyby von. Namiesto toho skôr, ako urobíte:
<% events.each do |event| %> # or similar code that you"re using
... # to iterate over the collection
<% end %>
Mali by ste to skontrolovať events.present?
:
<% if band.events.present? %>
<% band.events.each do |event| %>
...
<% end %>
<% else %>
# show something else
<% end %>
Kvôli úplnosti však allow_nil
sa používa na konkrétnych poliach modelu na preskočenie ďalších overení platnosti tohto poľa, ak je toto pole nulové. ([Pozri dokumentáciu tu.]) (http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil)
To nefunguje v kóde, ktorý ste zverejnili vo svojej otázke, pretože tam nie je event_id
pole na Band
model - keďže sa jedná o združenie one-to-many od Band
na Events
(za predpokladu, že ste svoju databázu nastavili správne).