2

外部キーでもあるモデルFriendship があります:friend_id:user_id

friendships
id | user_id | friend_id

2つのフィールドの一意性を検証すると、次のようになることを認識しています

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

しかし、検証する方法はありますか

user_id = 1, friend_id = 3
user_id = 3, friend_id = 1 

それだけ user_id = 1, friend_id = 3が保存されますか?

4

6 に答える 6

2

質問をもっとよく読んで、それは本当にそうだと思います

validates :friend_id, :uniqueness => {:scope => :user_id}
于 2013-01-01T01:13:18.553 に答える
1

これは難しい問題です。

対称関係をどのようにモデル化しますか?

前回これを行ったとき、実際には対称ではないと判断しました。これをモデル化する方法については、Disapora のContactクラスを参照してください。

class Contact < ActiveRecord::Base
  belongs_to :user
  belongs_to :person
  validates :person, :presence => true
  validates_presence_of :user
  validates_uniqueness_of :person_id, :scope => :user_id
end

一意性を確保するために特別なことは何もしていないことに気付くでしょう。

彼らが代わりに行うことは、友情を生み出すか壊す相互作用の各ポイントを慎重に検討することです. それらをトランザクションでラップするように注意する必要があります。

基本的に、ユーザーが「友達リクエスト」を送信すると、

  1. 「ユーザー」から「友人」への連絡先を「保留中」ステータスで作成します
  2. 「友人」から「ユーザー」への連絡先を「要求済み」ステータスで作成します

「友達」がこの「依頼」を承諾したとき

  1. 両方の連絡先が「承認済み」に設定されています

「友達」が友情を壊すことを選択した場合

  1. 両方の連絡先が削除されました

これらの各アクションは、トランザクションで実行する必要があります。

これらのトランザクションが正しく 1 つである限り、私たちは一方通行の友情を持つべきではありません。

于 2013-01-01T01:04:54.100 に答える
1
validate :relationship_uniqueness

def relationship_uniqueness

  existing_record = Friendship.find(:first, :conditions => ["user_id = ? AND friend_id = ?", user_id, friend_id])
  unless existing_record.blank?
    errors.add(:user_id, "has already been saved for this relationship")
  end

end
于 2013-01-01T01:08:20.437 に答える
1

もう1つ!

def unique_relationship?
    self.class.where("(user_id = ? and friend_id = ?) or 
                      (user_id = ? and friend_id = ?)", 
                      user_id, friend_id, friend_id, user_id).empty?
end
于 2013-01-01T01:15:33.047 に答える
0

だから私はこれを回避する方法を考えましたが、それは非常に厄介です

friendships
id
1

friend_lists
id | friendship_id | user_id
1  |       1       |   1
2  |       1       |   3

このようにして、1 つfriendship_idが に 2 回しか入力できないことを確認する必要がfriend_listsあります。

validates :friendship_id, :uniqueness => {:scope => :user_id}
于 2013-01-01T00:46:22.723 に答える
0

私は試してみます:

validate :unique_relationship

def unique_relationship
  (user_id.to_s + friend_id.to_s).uniq
end
于 2013-01-01T00:50:07.363 に答える