【问题标题】:Rails validation callback just onceRails 验证回调仅一次
【发布时间】:2014-08-19 23:06:01
【问题描述】:

我正在尝试弄清楚如何只验证一次模型。

情况如下:

这是关于图书馆管理

class Loan < ActiveRecord::Base
  attr_accessible :book_id, :check_in, :check_out, :member_id

  belongs_to :book
  belongs_to :member

  validates :member_id, :presence => true
  validates :book_id, :presence => true

  validate :returned_book, :on => :update


  def returned_book
    self.book.update_attributes! quantity: self.book.quantity + 1
    self.book.update_attributes! borrowed_count: self.book.borrowed_count - 1
  end

end

我想做的是,当我输入check_out 日期时(我要还书):

  • 增加图书的quantity
  • 减少图书的borrowed_count

但只有一次,不是每次我更新记录或更改check_out 日期

我的代码在这里,每次我保存(更新)验证运行的记录...

【问题讨论】:

  • 这听起来像是过早的优化。您应该开始动态计算图书属性。众所周知,计数器很难正确。考虑重新设置、清除和设置日期。无论您想出什么方案都应该跟踪它,并且计数器更新应该看起来是原子的,这需要显式锁定。
  • 是的...一位朋友告诉我在没有计数器列的情况下再次重组我的架构。我会尽力。还是谢谢你

标签: ruby-on-rails validation


【解决方案1】:

验证应该用于验证事物,而不是修改状态。在这种情况下,回调会更合适。可能是这样的:

attr_accessor :quantities_adjusted

before_save :update_quantities

def update_quantities
  if changed_attributes.keys.include?('check_out') && !quantities_adjusted
    self.book.quantity += 1
    self.book.borrowed_count -= 1
    self.quantities_adjusted = true
  end
end

【讨论】:

  • 几乎!感谢您的解释,但有一件事......当我更改 check_out 日期时,回调 update_quantities 再次运行,我不想要它,因为无论日期如何,它都已经返回
  • 我刚刚对你所追求的东西进行了 WAG。这应该让您朝着正确的方向前进,您可能需要针对您的特定用例进行调整...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多