2013-04-07 17 views
0

我在我的數據庫的表中有兩個布爾字段。如何在Rails 3中一次更新2個表格域?

都被默認爲FALSE

這是我在我看來

<%= label_tag(:post_draft, "Draft?") %> 
<div class="ItemCheckboxAlign"><%= f.check_box :draft %></div> 

正如你所看到的,我對他們有一個正常工作。是否有可能關聯另一個布爾型字段,因此如果選中,該值也會更改爲TRUE? 我想保持這兩個布爾值字段值完全分開,除非我試圖用這個複選框來更新這兩個值。

我的架構:

create_table "posts", :force => true do |t| 
    t.text  "content" 
    t.integer "user_id" 
    t.datetime "created_at",       :null => false 
    t.datetime "updated_at",       :null => false 
    t.boolean "draft",   :default => false 
    t.boolean "sendreminder",   :default => false 
    end 

我想要得到,如果對號被選中,當用戶的帖子底部的兩個布爾字段改爲TRUE。我已經有了「草案」的工作,但只是試圖讓另一個人立即改變。

經過下面的一些討論,我試圖應用update_attribute(sendreminder, true)方法。我如何在我的模型中包含這一點,以便只有在draft = true時才使sendreminder = true?

回答

0

在控制器上,你可以這樣做:

my_model = MyModel.find(params[:id]) 
my_model.assign_attributes(params[:my_model]) 
my_model.sendreminder = my_model.draft 
if my_model.save 
    bla bla bla 
else 
    bla bla bla 
end 

只是確保你使用的型號更換爲MyModel和唧唧歪歪是僞代碼:)


如果您希望每次保存模型時都能保持一致,則可以在模式中使用before過濾器。

class Post < ActiveRecord:Base 
    before_save :associate_draft 

    def associate_draft 
    self.sendreminder = self.draft unless self.sendreminder == true 
    end 
end 

,然後每次保存或更新模型時,該過濾器將被執行並post_draft的值將總是比草案相同的值。

+0

所以沒有辦法將這個代碼中的第二個字段關聯起來<%= f.check_box:draft%>?我已經更新了模式的原始文章進一步澄清了我在您的更新代碼中要求 – johbones 2013-04-07 06:32:38

+0

的內容,我不應該將「sendreminder」值設置爲與':associate_draft'中的「draft」相同嗎? – johbones 2013-04-07 06:47:04

+0

是的,我直到現在還沒有檢查模式 – rorra 2013-04-07 06:54:22

2

您還可以將before_save回調添加到您的模型中,並根據模型實例的新狀態檢查是否需要更新其他字段。

+0

我想在我的模型中使用這個'before_save'回調,並且它使兩個表字段相等,以便工作。但是它會導致一個問題。我需要在我手動審查後將名爲「draft」的字段之一更新爲FALSE,同時將名爲「sendreminder」的第二個字段永久保存爲TRUE,但此'before_save'可防止發生任何此類情況。當我嘗試將「草稿」值恢復爲假時,沒有任何反應。你知道這可以解決嗎? – johbones 2013-04-07 07:41:47