Ho visto la presentazione di Sandi Metz nothing is something un paio di volte. Mi rendo conto di non effettuare controlli nulli ovunque nei miei progetti di rotaie, ma non so come evitare controlli nulli e come farlo in modo orientato agli oggetti quando si tratta di associazioni.Modo orientato agli oggetti per eseguire controlli nulli per le associazioni nei binari
Considerate queste associazioni:
#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
prendo un utente:
@user = User.find(1)
e voglio trovare il suo blog:
@user.blog
=> nil
Esso restituisce nil
qui perché questo user
accade per non avere associato blog
, quindi il follo Codice dell'ala avrebbe rompere l'applicazione se ho fatto qualcosa di simile per questo user
:
@user.blog.title
=> undefined method `title' for nil:NilClass
La soluzione semplice è quella di farlo nel modo non orientata agli oggetti e basta fare un assegno pari a zero (ma questo è ciò che vogliamo al fine di evitare, perché i controlli altrimenti nil sono assolutamente ovunque nell'applicazione):
@user.blog.title if @user.blog
Facendo controlli nil ottiene più ingombrante e procedurale più ci si passa attraverso associazioni come di seguito:
@user = User.find(1)
if @user.blog && @user.blog.hash_tag #checking for nil twice
@user.blog.hash_tag.tag_name
end
Qual è il modo orientato agli oggetti per evitare controlli nulli per le associazioni?
Sono a conoscenza dei binari 'try method, sebbene Metz non abbia raccomandato il metodo try
. Forse però quando si tratta di associazioni in binari: try
è l'opzione migliore?
** Solo un suggerimento: * * Invece di sparare '@user.b log' ogni volta, puoi metterlo in una variabile come '@user_blog = @ user.blog' e controllarne la presenza ovunque richiesto come:' @ user_blog.present? ' – Abhi