最近学习 Ruby-China 的源码,我的关注代码大概由以下代码实现:
def follow_user(user)
return false if user.blank?
self.transaction do
self.push(following_ids: user.id)
user.push(follower_ids: self.id)
end
#Notification.notify_follow(user.id, self.id)
end
def follow
current_user.follow_user(@user)
redirect_to :back
end
def push(hash)
hash.each_key do |key|
old_val=self[key] || []
old_val<<hash[key].to_i
old_val.uniq!
update_attributes(key=>old_val)
end
end
def pull(hash)
hash.each_key do |key|
old_val=self[key]
return true if old_val.blank?
old_val.delete(hash[key].to_i)
update_attributes(key=>old_val)
end
end
结果发现..
self.transaction do
self.push(following_ids: user.id)
user.push(follower_ids: self.id)
end
这里的事务处理关注动作时在我的数据库只能更新 following_ids 而并没有把被关注者的 follower_ids 给新增数据
例如:
<..following_ids: [1], follower_ids: []> # 这是关注者的一个刚刚执行'关注'后的'following_ids'值,可以看出被更新了
---------------------------------------------------------
<..following_ids: [], follower_ids: []> # 这是被关注者的一个刚刚执行'关注'后的'follower_ids'值,并没有被更新
为什么事务处理并没有把这两个数据同时改动呢?