0

我想檢查複選框是否被選中,如果是,然後更新所有記錄的特定列(update_checkbox - 我的表中的布爾值)爲真的所有記錄。更新記錄,如果複選框被選中

其主要目的是在列中只有一個記錄可以是'真',並且當創建/編輯新記錄並且選中該複選框時,該記錄將爲真,並將另一個記錄變爲假。

在型號/ article.rb:

class Article < ActiveRecord::Base 
    if :update_checkbox == '1' 
    #find records where update_checkbox is true & update to false 
    Article.where(:update_checkbox => true).update_all(:update_checkbox => false) 
    end 
end 

我可以更新我的記錄不錯,但它是我在遇到問題的「如果複選框被選中」的一部分 - 目前,當我創建update_checkbox新紀錄檢查此標誌設置爲true的行未被設置爲false。任何幫助表示讚賞!

回答

1

可以實現通過ActiveRecord的after_save回調

after_save :reset_update_checkbox 

def reset_update_checkbox 
    Article.where(:update_checkbox => true).update_all(:update_checkbox => false) 
end 

after_save回調將運行後創建/更新和您的update_checkbox現場重置爲false。

UPDATE

請考慮此解決方案。基於@ index's asnwer

after_create :reset_and_update 
after_update :reset_and_update if update_checkbox_checked? 

def reset_and_update 
    Article.where("id = ? and update_checkbox = ?", self.id, true).update_all(update_checkbox: false) 
end 

def update_checkbox_checked? 
    self.update_checkbox 
end 

我很確定它會做的伎倆。

+0

感謝您的幫助!這工作......主要是:)但我想保持當前記錄爲真,而將所有其他人設置爲假。此外,這並不檢查複選框是否爲真/選中,因此所有記錄都將更新爲false(不是我要找的)。 – LKB

+0

我已將'after_save'更改爲'before_save',解決了第一個問題。仍在尋找一種方法來檢查複選框是否被選中。 – LKB

+0

@LKB不知道你需要用'true'保留現有記錄。在這種情況下,請看@索引的答案。它將通過'update_checkbox = true'保留現有記錄。 – retgoat

1

你可以使用一個回調,做這樣的事情:

after_save :reset_and_update if update_checkbox_checked? 

def reset_and_update 
    Article.where.not(id: self.id).update_all(update_checkbox: false) 
end 

def update_checkbox_checked? 
    self.update_checkbox 
end 

after_create只想更新所有其他記錄falseafter_update將首先檢查update_checkbox是否爲真,並將所有從自我更新到false

測試使用此數據:

def update_checkbox_checked? 
    puts "this checkbox value is #{self.update_checkbox}" 
    puts self 
    self.update_checkbox 
end 
+0

感謝您的回答!我放棄了它,它將前面的'update_checkbox'值替換爲false,但是如果新記錄的複選框爲真*和* false,它會這樣做。 – LKB

+0

看來,複選框檢查正在被完全忽略。任何想法? – LKB

+0

默認情況下,您是否使用'update_checkbox'創建記錄爲'true'? – index