>我有一个用户模型,其中包含多对多自连接表,如下所示
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
简而言之,用户可以拥有许多关注者,并且可以关注许多用户。当用户 A 跟随用户 B 时,将创建关系记录,其中 user_1 = 用户 A 和 user_2 = 用户 B。
我需要实现唯一性验证,以确保用户 A 和用户 B 之间仅存在一条记录。因此,如果记录存在
user_1 == UserA AND user_2 == UserB
那么在
Either
user_1 == UserA and user_2 == UserB
OR
user_1 == UserB and user_2 == UserA
编写自定义验证器以检查唯一性。
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