使用Rails 4在模型上的状态之间切换

Gui*_*nge 0 ruby-on-rails ruby-on-rails-4

场景

我的数据库上有一个名为的表budgets.它有author_id,status,answered_at列.

目标

如果status != 1,那么author_idanswered_atnil/ null.

问题

我有以下方法budgets_controller.rb:

def update
  budget = Budget.find(params[:id])
  budget.update_attributes(status: 1, author_id: current_user.id, answered_at: DateTime.now.to_date)

  budget.save!
end
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以重复使用相同的方法(update)来改变author_idanswered_at为null,status本身0如果是 1.某种toggle.

知识

我看到Rails提供了这种方法来切换布尔值,但我无法看到它如何能够满足我的需要,因为我正在使用另外两个不是布尔值的列.

ABM*_*gil 5

我想你可能想要的是一个模型回调.在你的实例中,像

# on models/budget.rb

before_update :nullify_author

def nullify_author
  if status == 1
    author = nil
    answered_at = nil
    status = 0
    save
  end
end
Run Code Online (Sandbox Code Playgroud)

此外,你不应该toggle在这里使用.Ruby的虚假性比JavaScript更严格.在Ruby的情况下,只有false并且nil是假的.对你而言,0 并不是假的,而是真实的.要证明这一点,试试吧!0.返回的值是布尔值false而不是FixNum 1