如何使用Ruby on Rails中的额外列验证连接表的唯一性

时间:2013-03-27 13:53:50

标签: ruby-on-rails ruby

我在一个自我引用的模型中有很多关系。在连接表中,我还有一个额外的列,用于定义关系的来源。在向该关系添加新对象时,我希望根据user_id,friend_id和source_id

避免连接表中的重复项

用户模型

 class User < ActiveRecord::Base
      has_many :friendships
      has_many :friends, :class_name => "User", :through => :friendships
 end

加入模型

 class Friendship < ActiveRecord::Base
     attr_accessible :friend_id, :user_id, :source_id, :alert, :hide

     # Relationships
     belongs_to :user
     belongs_to :friend, :class_name => "User"
     has_one :source
 end

我知道我可以这样做

 unless user.friends.include?(newFriend)
      user.friendships.build(:friend_id => friendUser.id, :source_id => source.id)
 end

但似乎它会检查新用户是否存在于当前用户的朋友中。我需要检查连接模型级别,并确保连接不存在给定的源ID。

我知道有几种方法可以实现这一点,但我对rails上的ruby很新,我正在寻找“轨道方式”来实现它。

1 个答案:

答案 0 :(得分:2)

您可以根据中间表中的多个列进行验证,如下所示:

  validates_uniqueness_of :user_id, :scope => [:friend_id, :source_id]