【问题标题】:How to not contain timestamp when changing state on update object?更改更新对象的状态时如何不包含时间戳?
【发布时间】:2013-02-14 19:45:42
【问题描述】:

我使用工作流作为状态机。我想在每次更新后将状态移动到awaiting_review,但在用户登录后我也有current_sign_in_at属性,他的状态更改为awaiting_review如何避免这种情况?

before_save :needs_review, on: :update

# before_save
def needs_review
  self.state = 'awaiting_review' unless state_changed?
end

workflow do
  state :awaiting_review do
    event :accept, :transitions_to => :accepted
    event :reject, :transitions_to => :rejected
  end
  state :accepted do
    event :reject, :transitions_to => :rejected
  end
  state :rejected
end
#  sign_in_count          :integer          default(0)
#  current_sign_in_at     :datetime
#  last_sign_in_at        :datetime
#  current_sign_in_ip     :string(255)
#  last_sign_in_ip        :string(255)

【问题讨论】:

  • 哪些字段更新应该触发状态变化?您可以使用changed 方法来专门检测这些。
  • 除我在 cmets 中提到的这些以外的所有字段:[sign_in_count ..]

标签: ruby-on-rails ruby ruby-on-rails-3 state-machine state-machine-workflow


【解决方案1】:
def needs_review
  if (%w[sign_in_count current_sign_in_at last_sign_in_at ...] & changes).empty?
    self.state = 'awaiting_review' unless state_changed?
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2020-01-28
    相关资源
    最近更新 更多