W mojej aplikacji railsowej moje zespoły mają wiele imprez. W opinii zespołów może pokazać, jakie wydarzenia mają. Mój problem polega na tym, że jeśli zostanie utworzone nowe pasmo, wyrzuci błąd w widoku, ponieważ nie ma zdarzenia.
Czytałem o allow_nil i chciałem go użyć w moim modelu pasm, ale nie jestem pewien, jak to zaimplementować. Dokumentacja na ten temat jest dość sucha i niezbyt pomocna
class Band < ApplicationRecord
has_many :events :allow_nil true
end
Nie jestem pewien, czy powyższy sposób jest prawidłowy.
Odpowiedzi:
0 dla odpowiedzi № 1Szyny 5.x
Myślę, że szukasz optional: true
, ale musi zostać dodany w belongs_to
strona stowarzyszenia, na przykład:
class Event < ApplicationRecord
belongs_to :band, optional: true
end
Rails 4.x
Rails 4 pozwala nil
Domyślnie w każdym skojarzeniu wystarczy usunąć wymaganą weryfikację band_id
obecność.
-1 dla odpowiedzi № 2
Podejrzewam, że to, o co prosisz (sprawdzanie poprawności danych na poziomie ActiveRecord w powiązanych modelach) nie jest w rzeczywistości twoim problemem. Twoje oryginalne pytanie dotyczy allow_nil
ale stwierdzasz, że (z moim naciskiem):
W opinii zespołów może pokazać, jakie wydarzenia mają. Mój problem polega na tym, że jeśli zostanie utworzone nowe pasmo, wyrzuci błąd w widoku, ponieważ nie ma zdarzenia.
To, co prawdopodobnie robisz, to próba wyświetlenia listy zdarzeń przez iterację po nich za pomocą .each
, ale ponieważ zbiór wydarzeń nie istnieje .each
błędy. Zamiast tego, zanim to zrobisz:
<% events.each do |event| %> # or similar code that you"re using
... # to iterate over the collection
<% end %>
Powinieneś to sprawdzić events.present?
:
<% if band.events.present? %>
<% band.events.each do |event| %>
...
<% end %>
<% else %>
# show something else
<% end %>
Jednak ze względu na kompletność allow_nil
jest używany na określonych polach modelu, aby pominąć inne walidacje tego pola, jeśli to pole jest zerowe. ([Zobacz dokumentację tutaj.]) (http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil)
Nie działa w kodzie, który zamieściłeś w swoim pytaniu, ponieważ nie ma pliku event_id
pole na twoim Band
model - ponieważ jest to skojarzenie jeden do wielu Band
do Events
(zakładając, że poprawnie skonfigurowałeś bazę danych).