2011-11-10 11 views
10

Bir alan için kullanılabilir değerleri kısıtlamak istiyorum. Bu nedenle, sütunun değeri belirtilen değerler kümesinden olmalıdır. Göç/model kullanarak mümkün mü? Yoksa DB'mde el ile mi yapmalıyım?Sütun için değerler nasıl kısıtlanır

cevap

24

Bunun için doğrulamaları kullanacağız var özgül 2015

class Person < ActiveRecord::Base 
    validates :relationship_status, 
    :inclusion => { :in => [ 'Single', 'Married', 'Divorced', 'Other' ], 
    :message => "%{value} is not a valid relationship status" } 
end 

Düzenleme Ağustos: Raylar 4.1 itibariyle, bunun için enum sınıf yöntemi kullanabilirsiniz Bu sizin sütunu bir olmasını gerektirir Bu durumda aradığınız yardımcı örneğin :inclusion olduğunu. tamsayı türü:

class Person < ActiveRecord::Base 
    enum relationship_status: [ :single, :married, :divorced, :other ] 
end 

otomatik de sana bazı kullanışlı yöntem tanımlar: http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html

+0

Taşıma düzeyine ayarlamak mümkün mü? – damluar

+2

Veritabanı düzeyinde kısıtlamalar oluşturabilirsiniz - MySQL ve PostgreSQL örneğin bir sütun türüne sahiptir, örneğin SQLite ve Oracle bunu yapmaz - ancak Raylar bunları doğrudan desteklemez. Desteklenmeyen sütun türlerini kullanabilirsiniz. t.column: col_name, 'CUSTOM SQL TYPE', ancak bu değerlerin birçoğunu ele alırsınız ve bu geçişleri farklı bir RDBMS'de çalıştıramazsınız. diğerleri) belgelere özellikle karşı uyarır. –

+0

Teşekkürler, dostum. Çok yardımcı oldun! – damluar

2

İhtiyacınız olan güven miktarına bağlıdır. Bu değerlerle kısıtlamak için modelinize bir geçerlilik kazandırıcı ekleyebilir, ancak mevcut verilerin eşleşeceğinden emin olmazsınız (ve daha sonraki kayıtların doğrulama nedeniyle başarısız olmasına neden olur) ve diğer değişiklikler diğer uygulamalar tarafından da yapılabilir. çevreleyen ham sql.

Mutlak bir güven istiyorsanız, veritabanını kullanın. . Burada

size raylar doğrulayıcı neler yapabileceğini kıyasla sınırlı oldukça edildiği (veritabanında yaparsanız kullanmak isteyebilirsiniz ne:. a whole Rails guide on the topic http://www.w3schools.com/sql/sql_check.asp

+0

sayesinde, evet, doğrulama hakkında bilmek:

p = Person.new(relationship_status: :married) p.married? # => true p.single? # => false p.single! p.single? # => true 

Burada enum belgelerine okuyabilir. Ve kısıtlamalarımı geçiş dosyasında belirtebilir miyim? – damluar

+1

Eşleşmeyen, bunları güncelleyen/silenler olan bir geçiş oluşturabilirsiniz. Yine de uyarılırsınız - modellerinizi geçişinizde kullanırsanız, modellerin geçişin bekleyişiyle senkronize olmadığında kullanıcıları yönlendirebilirsiniz. – Ponny

+0

Yardım için teşekkürler! – damluar

İlgili konular