2012-10-13 34 views
0

在我的Rails應用程序中,我有Card和Pack模型以及它們之間的多對多關係。我想驗證一個包裏面正好有3張卡片。該包使用複選框實現與卡片關聯。has_many關係計數的Rails模型驗證

我的問題:驗證運行時,似乎沒有關聯。驗證失敗,打印輸出爲「卡數爲:0」。爲什麼驗證運行時沒有關聯? (注:同夥是由正確時,確認被刪除,所以代碼工作,只是沒有驗證)

# Pack Model 
class Pack < ActiveRecord::Base 
    has_many :pack_elements 
    has_many :cards, :through => :pack_elements 
    validate :validate_number_of_cards 

    def validate_number_of_cards 
    puts "cards count is: " + cards.count 
    errors.add(:cards, "A pack must contain exactly 3 cards.") if (cards.count != 3) 
    end 
end 

其他模型就像你所期望的,但沒有驗證。這是Packs表單,它顯示所有卡片,每個卡片旁邊的複選框以及提交按鈕。我想測試這三個盒子是否被選中,我希望測試是在模型中,而不是在表單中。

# packs/_form.html.erb 
<%= form_for(@pack) do |f| %> 

<div class="field"> 
    <% @cards.each do |card| %> 
     <%= hidden_field_tag "pack[card_ids][]", nil %> 
     <%= check_box_tag "pack[card_ids][]", card.id, @pack.card_ids.include?(card.id), id: dom_id(card) %> 
     <%= label_tag dom_id(card), card.description %> 
     <hr/> 
    <% end %> 
</div> 

<div class="actions"> 
    <%= f.submit %> 
</div> 
+0

你解決了這個問題嗎?因爲我有一個相似的,並且找不到答案。 –

+0

@MarcinDoliwa我確實解決了它,請參閱下面的答案。 –

回答

3

上面的實現中的問題是我使用計數方法,該方法執行數據庫查找。數據庫在驗證通過之前不會保存,因此無法工作。我改變了實施:

def validate_number_of_cards 
    puts "Count shows there are " + cards.count + " cards." # always returns zero 
    puts "Size shows there are " + cards.size + " cards." 
    errors.add(:cards, "A pack must contain exactly 3 cards.") if (cards.size != 3) 
end 

它使用大小方法,它只是着眼於什麼是在內存中。這工作正常。

0

的驗證是在包模式。所以保存包模型時會觸發驗證。

您需要在保存卡模型時處理此驗證。

+0

我如何從卡片模型中驗證包裝中有多少張卡片?我看不到有辦法做到這一點。 –