Rails: Понимание области уникальности? - PullRequest
2 голосов
/ 25 апреля 2019

Это, вероятно, глупый вопрос, но я хочу убедиться, что я понимаю, как поле "область действия" с ограничением модели уникальности.

Я следовал этому руководству: https://dankim.io/mutual-friendship-rails/ доразбираюсь в обработке "друзей" ассоциаций в рельсахВ одной части говорится о создании ограничения уникальности:

validates :friend, presence: true, uniqueness: { scope: :user } (что относится к модели friendship.

Так что это говорит о том, что поле friend_id никогда не должно дублироватьсяс тем же user_id полем, верно?

Разве это не сработало бы так: validates :user, presence: true, uniqueness: { scope: :friend }

То, что пользователь не должен появляться более одного раза с user_id, имеющимдубликат friend_id. Или я неправильно понимаю, как здесь работает scope

Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Разница в том, в каком поле проверяется, потому что отношение является направленным (а чтобы сделать его ненаправленным - в статье создается обратное отношение).

В вашем примере - для дублированных записей обратное соотношение не сможет проверить

Также для проверки uniqueness всегда полезно иметь соответствующий уникальный индекс базы данных (поскольку сохранение проверки не является атомарным)

2 голосов
/ 25 апреля 2019

Вы правы.Scope - это причудливый способ сказать, разрешить только один дуплекс (пользователь, друг) .

Если вы установите индекс для своей БД (который необходим, чтобы избежать условий гонки с проверкой уникальности), высделаю точно так же:

add_index :friendships, [:user_id, :friend_id], unique: true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...