组合键进行Rails验证

时间:2018-08-07 16:38:02

标签: validation ruby-on-rails-4 activerecord custom-validators

我的用户模型具有多对多的自联接表,如下所示

class User < ActiveRecord::Base
   has_many :follower_relationships, foreign_key: :user_2_id, class_name: 'Relationship'
   has_many :followee_relationships, foreign_key: :user_1_id, class_name: 'Relationship'
   has_many :followers_all, through: :follower_relationships, source: :user_1
   has_many :followees_all, through: :followee_relationships, source: :user_2

使用以下模型创建联接

class Relationship < ActiveRecord::Base
    belongs_to :user_1, class_name: 'User', foreign_key: :user_1_id
    belongs_to :user_2, class_name: 'User', foreign_key: :user_2_id

简而言之,一个用户可以有很多关注者,并且可以关注很多用户。当UserA跟随UserB时,将创建一个关系记录,其中user_1 = UserA,而user_2 = UserB。

我需要实施唯一性验证,以确保UserA和UserB之间仅存在一条记录。因此,如果记录存在

user_1 == UserA AND user_2 == UserB 

然后

不应存在其他关系
Either

user_1 == UserA and user_2 == UserB 

OR

user_1 == UserB and user_2 == UserA

1 个答案:

答案 0 :(得分:0)

编写自定义验证器以检查唯一性。

class Relationship < ActiveRecord::Base
    ...

    validate :follow_unique_users

    def follow_unique_users
        if where('(user_1_id = :user_1_id and user_2_id = :user_2_id) or (user_1_id = :user_2_id and user_2_id = :user_1_id)', {user_1_id: <user_1_id>, user_2_id: <user_2_id>}).exist?
          errors.add(:base, "error message")
        end
    end
end