2016-06-01 166 views
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