如何在Rails 3中一次复选框更新2个表字段?

时间:2013-04-07 05:28:11

标签: ruby-on-rails ruby ruby-on-rails-3

我的数据库中的表中有两个布尔字段。

两者都默认为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

2 个答案:

答案 0 :(得分:2)

您还可以向模型添加before_save回调,并根据模型实例的新状态检查是否需要更新其他字段。

答案 1 :(得分: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替换为您正在使用的模型, bla bla bla 是伪代码:)


如果您希望每次保存模型时都使用相同的功能,则可以在模式上使用前置过滤器。

class Post < ActiveRecord:Base
  before_save :associate_draft

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

然后每次保存或更新模型时,都会执行该过滤器,并且post_draft的值将始终与draft相同。