Kilka razy oglądałem prezentację Sandi Metz 'nothing is something. Zdaję sobie sprawę, że robię zerowe kontrole w całym miejscu w moich projektach szyn, ale nie wiem, jak uniknąć zerowych kontroli i jak to zrobić w sposób zorientowany obiektowo, jeśli chodzi o skojarzenia.Obiektowy sposób przeprowadzania zerowej kontroli powiązań w szynach
Rozważ te skojarzenia:
#app/models/user.rb
class User < ActiveRecord::Base
belongs_to :blog
end
#app/models/blog.rb
class Blog < ActiveRecord::Base
belongs_to :hash_tag
has_one :user
end
#app/models/hash_tag.rb
class HashTag < ActiveRecord::Base
has_one :blog
end
łapię użytkownika:
@user = User.find(1)
I chcę, aby znaleźć jego blog:
@user.blog
=> nil
Zwraca nil
tutaj, bo to user
dzieje nie mieć żadnego powiązanego blog
, więc w następujący sposób: Kod Skrzydło złamie wniosek, jeśli zrobiłem coś podobnego do tego user
:
@user.blog.title
=> undefined method `title' for nil:NilClass
Prostym rozwiązaniem jest zrobić to tak non-obiektowego i po prostu zrobić nil czek (ale to jest to, co chcemy w celu uniknięcia, ponieważ w przeciwnym razie sprawdza nil są absolutnie wszędzie w aplikacji):
@user.blog.title if @user.blog
Doing kontrole zerowe staje się bardziej kłopotliwe i proceduralny głębiej idziesz przez stowarzyszenia takie jak poniżej:
@user = User.find(1)
if @user.blog && @user.blog.hash_tag #checking for nil twice
@user.blog.hash_tag.tag_name
end
Jaki jest obiektowy sposób unikania zerowej kontroli stowarzyszeń?
Jestem świadomy szyn "try method, choć Metz nie polecał metody try
. Być może jednak, jeśli chodzi o skojarzenia w szynach: try
jest najlepszą opcją?
** tylko sugestia: * * Zamiast wypalania '@user.b loguj za każdym razem, możesz umieścić go w zmiennej typu '@user_blog = @ user.blog' i sprawdzić jego obecność wszędzie tam, gdzie jest to wymagane:' @ user_blog.present? ' – Abhi