【问题标题】:Really Frustrating: validate method with callback in rails 4真的令人沮丧:在rails 4中使用回调验证方法
【发布时间】:2016-01-07 20:48:20
【问题描述】:

我在使用这些验证和回调方法时遇到了问题。

保存对象后,我想更新关联模型对象的两列,如 adjust_inventory 回调方法所示。

但是,如果运行 adjust_inventory 方法导致units.quantity

这是我的模型(已更新): 注意:我正在使用基于这篇文章的 deferred_associations gem:http://mikrobi.github.io/validating-has-and-belongs-to-many-associations-with-rails-3/

class Order < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_and_belongs_to_many :products
  has_and_belongs_to_many_with_deferred_save :units
  validate :prevent_oversell
  after_create :adjust_inventory



  def adjust_inventory
    units.each do |ad|
      if ad.quantity_sold.blank?
    ad.update_attribute(:quantity_sold, 0)
    end
      new_quant = ad.quantity-1
      new_quant_s = ad.quantity_sold+1
      ad.update_attribute(:quantity, new_quant)
      ad.update_attribute(:quantity_sold, new_quant_s)
    end
  end

  def prevent_oversell
      @arr = []
      self.units.each do |q|
        @arr << q.id
      end

      hash = @arr.inject(Hash.new(0)) {|h,x| h[x]+=1;h}

      self.units.each do |t|
        if t.quantity < hash[t.id] 
         errors[:base] = "Your selection exceeds available inventory. Please check that your size selection matches available inventory"
      end
    end    
  end
end

请帮帮我!!这让我发疯。

另一个更新:似乎验证正在防止导致数量

【问题讨论】:

  • 首先,如果您想在保存后执行此操作,请改用 after_save 回调。另外,请在else nil end 的任何位置删除这些东西,并直接在if end 块中执行;如果您想在验证后停止所有移动,请在方法末尾添加 false(返回 false)
  • 我尝试过使用 after_save,但仍然调用了 :adjust_inventory 方法。我还按照您的建议清理了代码。我也在 prevent_oversell 方法的每个循环的末尾添加了 false 。验证工作正常,但adjust_inventory 方法不管用。谢谢你的帮助。此外,使用 after_save 的问题在于,结果可能是在验证后将数量减少到
  • 试试这些方法的这个版本,我已经尝试重构它们pastebin.com/bLzNb5jy 并且在验证方法的最后一个结束之前结束 false
  • 这仍然不起作用。验证似乎工作正常,但错误消息显示不正确。
  • 因为没有记录被保存到导致 mikrobi.github.io/…,而这个宝石:github.com/MartinKoerner/deferred_associations。显然,在将记录保存到数据库之后才能访问关联的记录,因此为什么在保存之前验证关联的记录将不起作用。

标签: ruby-on-rails validation callback


【解决方案1】:

事实证明,这完全是我想做的事情的错误方式。这实现了我想要的:

class Unit < ActiveRecord::Base
  belongs_to :product
  has_and_belongs_to_many :orders
  validates_numericality_of :quantity, :only_integer => true, :greater_than_or_equal_to => 0
end

class Order < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_and_belongs_to_many :products
  has_and_belongs_to_many :units
  before_create :adjust_inventory
  validates_associated :units

  def adjust_inventory
    units.each do |ad|
      if ad.quantity_sold.blank?
         ad.update_attributes(quantity_sold: 0)
      end
      new_quant = ad.quantity-1
      new_quant_s = ad.quantity_sold+1
      ad.update_attributes(quantity: new_quant)
      ad.update_attributes(quantity_sold: new_quant_s)
    end
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多