0

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

两者都默认为 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)方法。我怎样才能在我的模型中包含它以使 sendreminder=true 仅当草稿 = true 时?

4

2 回答 2

2

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

于 2013-04-07T06:30:10.777 回答
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是伪代码 :)


如果您希望每次保存模型时都一样,您可以在您的模式上使用 before 过滤器。

class Post < ActiveRecord:Base
  before_save :associate_draft

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

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

于 2013-04-07T06:25:07.317 回答