2014-09-19 20 views
1

我有一個Ticket and Event模型,其中的關係是事件有許多票據。 Ticket模型具有列串行開始值和串行結束值,表示該事件的有效串行節點的範圍。使用來自另一個模型的數據進行Rails範圍驗證

我想在創建時驗證票證,以便如果使用超出該範圍的序列號創建票證,系統將發出錯誤說明範圍無效。

我目前在我的票模型驗證是另一種驗證,以顯示這是140000和149999之間

validates :serial_number, 
      presence: true, 
      numericality: { 
       only_integer: true, 
       :greater_than_or_equal_to => 140000, 
       :less_than => 149999, 
       :message => "is invalid" }, 
      :uniqueness => { :message => "%{value} has already been taken" } 

我需要從事件模型中獲取數據,並把它所有的事件有效的序列號進入票證驗證。 Rails是否允許在模型中使用類似的東西?我應該在控制器中執行嗎?

回答

3

絕對在你的模型中做到這一點。使用custom validations它:

validate :serial_number_valid 

def serial_number_valid 
    unless event.serial_number_range.include?(serial_number) 
    errors.add(:serial_number, "must be within range") 
    end 
end 
+0

解決方案中的小錯誤:'驗證:serial_number_valid'應該是'validate:serial_number_valid'。否則,就像一個魅力,謝謝! – 2014-09-19 18:53:15

+1

我鏈接到源的好東西:)我更新了答案。很高興我能幫上忙! – awendt 2014-09-19 20:20:31

0

的一種方式做,這是通過使用inclusion軌驗證幫手。此幫助程序驗證屬性的值是否包含在給定的集合中。對於這種特殊的情況下,你可以使用:

validates :serial_number, inclusion: { in: 140000..149999 }, presence: true, uniqueness: true 

如果你想用同樣的方法在軌道是一個link到這裏4路。

+1

但是,這個硬連線的範圍。問題是詢問如何設置範圍從事件模型關係中獲取範圍的開始和結束。 – pjmorse 2014-09-19 18:58:33