【发布时间】: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