在Rails中“创建”的两个不同结果

时间:2013-12-08 20:15:37

标签: ruby-on-rails

我正在尝试创建一个简单的社交网络,因此创建了以下UserFriendship类,它基本上有一个用户和朋友(也是一个用户)。

当我呼叫UserFriendship.request(users(:user1), users(:user2))时,它应该向数据库(user1,user2)和(user2,user1)添加两个友谊。

但是,不是将完整的数据集添加到数据库中。友谊1不完整。我不明白为什么create在友谊2中工作但在友谊中不起作用。

这里的友谊1& friendship2创建后:

<UserFriendship id: nil, user_id: 755095536, friend_id: 204282540, created_at: nil, updated_at: nil, state: "pending">

<UserFriendship id: 980190966, user_id: 204282540, friend_id: 755095536, created_at: "2013-12-08 20:04:51", updated_at: "2013-12-08 20:04:51", state: "requested">

UserFriendship id:created_at:updated_at:Friendship1中为零,但在Friendship2

中不在
class UserFriendship < ActiveRecord::Base
    belongs_to :user
    belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'

    scope :accepted, -> { where(state: 'accepted') }
    scope :pending,  -> { where(state: 'pending') }

    validates :friend_id, uniqueness: { scope: :user_id }

    after_destroy :destroy_mutual_friendship!

    state_machine :state, :initial => :pending do
            after_transition on: :accept, do: [:send_acceptance_email, :update_mutual_friendship!]
            state :requested

            event :accept do
            transition any => :accepted
            end
    end

    def self.request(user1, user2)
            transaction do
            friendship1 = create(user: user1, friend: user2, state: 'pending')
            friendship2 = create(user: user2, friend: user1, state: 'requested')

            friendship1.send_request_email unless friendship1.new_record?
            friendship1
            end
    end
...
end

2 个答案:

答案 0 :(得分:1)

在您的交易中使用create!代替create。 bang变体在失败时抛出异常,导致事务回滚并让您更好地了解失败的原因。

答案 1 :(得分:1)

friendship1未被保存,这意味着它可能未通过您的验证,即这两个用户之间的友谊尚不存在。