2012-07-03 32 views
7

Aktif Kayıt ile Raylarda bir boolean kullanırken, (0) visible? sorduğunuzda, sütunun true olup olmadığını kontrol eder. false veya nil ise, visible?, false'u döndürecektir.İçindekiler ile kapsam raylar

? yönteminin false değerini döndürüp döndürmeyeceğini soran bir boole hakkında ne yapabilirsiniz? Ben şu var:

Ancak daha temiz bir yol olup olmadığını merak ediyorum. Bu kapsamı hem nil hem de false açıkça söylemeden yazmanın bir yolu var mı? Eğer tam tersi olsaydı, daha temiz görünüyor gibi

yazabiliriz. görünür kapsamı için en iyi kod nedir?

+0

Neden DB'de "gizle" varsayılan bir değer vermezseniz, o zaman alan daha temiz görünür: 'scope: visible, nerede (gizle: false)' – Wukerplank

+0

d yerine DB kesinlikle yanlış/doğru olsa almak zorunda kalmazsınız. – Peter

cevap

4

Sütunda bir varsayılan değer kullanın. Bu iki nedenden dolayı iyidir: DB'nizde yalnızca iki olası değeriniz bulunur ve kodunuzu kolaylaştırır. Ve booleanlar ya doğru ya da yanlıştır, nil değil, belki de, foobar değildir. Doğru ve yanlış. "DB'yi kesinlikle yanlış/gerçek olsa da almaktan kaçınmayı tercih ederim", bir boole sütunu için bir tartışma argümanıdır.

2'den fazla duruma gereksiniminiz varsa, bir durum makinesi veya benzeri bir şey kullanın - artık bir boolean sütunu/durumu değil. hide = NULL görünür ne de görünmeyen uğramamış ile SQL NULL yılında

scope :visible, -> { where(hide: false) } 
scope :invisible, -> { where(hide: true) } 

yüzden açıkçası kayıtları eksik veya bilinmeyen değeri temsil:

12

ben gelirdim. Stefan'ın cevap olarak hemen hemen aynı

3

, biraz basitleştirilmiş:

scope :visible, where(hide: false) 
scope :invisible, where(:hide) 

Bu PostgreSQL için çalışır, ama diğer veritabanları için çalışacaktır emin değilim.

+2

Raylarda 4: kapsam: görünür, -> {nerede (gizle: false)} – benoitr

0

Raylar 4 itibaren, şöyle gerçekleştirebilirsiniz:

# This will give you any hidden records 
scope :invisible, -> { where(hide: true) } 

# And this will give you any records that aren't hidden – whether nil *or* false 
scope :visible, -> { where.not(hide: true) } 

Tanel cevabı aslında eldeki soruya cevap olmamasına rağmen "Ne iyi kod görünür için var kapsam?", Kesinlikle bir boolean sütununun her zaman true veya false olması gerektiğini söylediğini yankılanırdım.

Gerçekten, hatta bir sütun izin vermelidir hiçbir veritabanı aksi takdirde gerçekten boole değil, true veya false etmesinden daha başka bir şey olmak boolean olarak ilan etti. Ama bu ayrı bir solucan konservesi. :-D