我的模特
class Auction
belongs_to :item
belongs_to :user, :foreign_key => :current_winner_id
has_many :auction_bids
end
class User
has_many :auction_bids
end
class AuctionBid
belongs_to :auction
belongs_to :user
end
当前使用情况
页面上显示拍卖,用户输入金额并点击出价。 Controller 代码可能如下所示:
class MyController
def bid
@ab = AuctionBid.new(params[:auction_bid])
@ab.user = current_user
if @ab.save
render :json => {:response => 'YAY!'}
else
render :json => {:response => 'FAIL!'}
end
end
end
所需的功能
到目前为止,这很好用!但是,我需要确保发生其他一些事情。
@ab.auction.bid_count
需要加一。 @ab.user.bid_count
需要加一 @ab.auction.current_winner_id
需要设置为 @ab.user_id
也就是说,与
User
关联的 Auction
和 AuctionBid
也需要更新值,以便 AuctionBid#save
返回 true。 最佳答案
保存和销毁自动包装在一个事务中
ActiveRecord::Transactions::ClassMethods
真正的大会!
class AuctionBid < ActiveRecord::Base
belongs_to :auction, :counter_cache => true
belongs_to :user
validate :auction_bidable?
validate :user_can_bid?
validates_presence_of :auction_id
validates_presence_of :user_id
# the real magic!
after_save :update_auction, :update_user
def auction_bidable?
errors.add_to_base("You cannot bid on this auction!") unless auction.bidable?
end
def user_can_bid?
errors.add_to_base("You cannot bid on this auction!") unless user.can_bid?
end
protected
def update_auction
auction.place_bid(user)
auction.save!
end
def update_user
user.place_bid
user.save!
end
end
荣誉奖弗朗索瓦·博索莱 +1。感谢
:foreign_key
的建议,但是 current_winner_*
列需要缓存在数据库中以优化查询。亚历克斯 +1。感谢您让我开始使用
Model.transaction { ... }
。虽然这最终对我来说并不是一个完整的解决方案,但它确实帮助我指明了正确的方向。关于ruby-on-rails - Rails 交易 : save data in multiple models,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2468366/