Ruby on rails 在Rails中,在事务完成后应用增量
用户进行交易,可能带有优惠券代码,最后状态更改,购物车标记为已完成,邮件发送。我试图做的是更新使用的优惠券代码,并进行增量更改。目前,交易的订单模型具有以下内容:Ruby on rails 在Rails中,在事务完成后应用增量,ruby-on-rails,Ruby On Rails,用户进行交易,可能带有优惠券代码,最后状态更改,购物车标记为已完成,邮件发送。我试图做的是更新使用的优惠券代码,并进行增量更改。目前,交易的订单模型具有以下内容: class TbCommerce::Order < ActiveRecord::Base self.table_name = 'tb_commerce_orders' scope :search, ->(term){ where('name LIKE ?', "%#{term}%") } belongs_to :c
class TbCommerce::Order < ActiveRecord::Base
self.table_name = 'tb_commerce_orders'
scope :search, ->(term){ where('name LIKE ?', "%#{term}%") }
belongs_to :cart, :inverse_of => :order, :foreign_key => :tb_commerce_cart_id
has_many :transactions, :inverse_of => :order, :foreign_key => :tb_commerce_order_id
has_one :captured_transaction, ->{ captured }, :class_name => 'TbCommerce::Transaction', :foreign_key => :tb_commerce_order_id
validates_presence_of :cart, :name, :address, :city, :state, :postal, :country
validates_uniqueness_of :cart
validates_length_of :address, :maximum => 30
validates :email, :format => {:with => Authlogic::Regex.email, :message => 'should look like an email address.'}
before_create :set_invoice_number
define_callbacks :capture
set_callback :capture, :after, :after_capture
def description
return cart.description
end
module Status
OPEN = 'open'
PLACED = 'placed'
SHIPPED = 'shipped'
REFUNDED = 'refunded'
REMOVED = 'deleted'
end
def full_name
return name
end
def full_address
return "#{address}, #{city} #{state}, #{postal}, #{country}"
end
private
def set_invoice_number
new_invoice_number = TbCommerce::Order.maximum(:invoice_number) || 1000000
loop do
new_invoice_number += 1
break unless TbCommerce::Order.exists?(:invoice_number => new_invoice_number)
end
self.invoice_number = new_invoice_number
end
def after_capture
update_attribute(:status, Status::PLACED)
cart.update_attribute(:is_completed, true)
coupon.update(:used => used + 1)
TbCommerce::OrderMailer.order_placed(self).deliver_later
TbCommerce::OrderMailer.order_confirmation(self).deliver_later
begin
TbCommerce.after_capture.call(self)
rescue e
logger.error "Failed to run the after_capture hook with message: #{e}"
end
return true
end
end
<% @coupons.each do |coupon| %>
<%= coupon.code %>
<%= coupon.used %>
<% end %>
def increment_coupon_used!
coupon.increment_used! if coupon.present?
return true
def increment_used!
update(:used => used + 1)
end
使用的增值券!实际上是:
class TbCommerce::Order < ActiveRecord::Base
self.table_name = 'tb_commerce_orders'
scope :search, ->(term){ where('name LIKE ?', "%#{term}%") }
belongs_to :cart, :inverse_of => :order, :foreign_key => :tb_commerce_cart_id
has_many :transactions, :inverse_of => :order, :foreign_key => :tb_commerce_order_id
has_one :captured_transaction, ->{ captured }, :class_name => 'TbCommerce::Transaction', :foreign_key => :tb_commerce_order_id
validates_presence_of :cart, :name, :address, :city, :state, :postal, :country
validates_uniqueness_of :cart
validates_length_of :address, :maximum => 30
validates :email, :format => {:with => Authlogic::Regex.email, :message => 'should look like an email address.'}
before_create :set_invoice_number
define_callbacks :capture
set_callback :capture, :after, :after_capture
def description
return cart.description
end
module Status
OPEN = 'open'
PLACED = 'placed'
SHIPPED = 'shipped'
REFUNDED = 'refunded'
REMOVED = 'deleted'
end
def full_name
return name
end
def full_address
return "#{address}, #{city} #{state}, #{postal}, #{country}"
end
private
def set_invoice_number
new_invoice_number = TbCommerce::Order.maximum(:invoice_number) || 1000000
loop do
new_invoice_number += 1
break unless TbCommerce::Order.exists?(:invoice_number => new_invoice_number)
end
self.invoice_number = new_invoice_number
end
def after_capture
update_attribute(:status, Status::PLACED)
cart.update_attribute(:is_completed, true)
coupon.update(:used => used + 1)
TbCommerce::OrderMailer.order_placed(self).deliver_later
TbCommerce::OrderMailer.order_confirmation(self).deliver_later
begin
TbCommerce.after_capture.call(self)
rescue e
logger.error "Failed to run the after_capture hook with message: #{e}"
end
return true
end
end
<% @coupons.each do |coupon| %>
<%= coupon.code %>
<%= coupon.used %>
<% end %>
def increment_coupon_used!
coupon.increment_used! if coupon.present?
return true
def increment_used!
update(:used => used + 1)
end
最近更新:
看起来记录器有我得到的错误。NoMethodError:未定义的方法'increment!'在@coupon.increment!:使用过甚至是TbCommerce::优惠券。增量!:使用了,因此出现了两个问题。首先是有一段感情,而我并没有正确地处理它。我最后做的是:
cart.increment_coupon_used!
Cart实际上包含了与订单具有关系的ValidateGroupon模型
存在的另一个问题是本地应用程序覆盖了这个gem。因此,在我将优惠券包含在购物车模型中之前,它永远不会起作用。优惠券.update:used=>used+1是否返回true?我可能遗漏了一些内容,但如果要访问当前值:used,则必须将其保存在变量中,或者像updateused一样传递它:@tupoly.used+1。尝试@PatMellon@dbugger它确实返回true,然后它正在更新。所以要么你要么:a提供了错误的值;b在捕获后再次更新;或者c看着错误的优惠券对象。你怎么确定它没有增加?恭喜你弄明白了。