Проверка уникальности не работает на has_many: хотя ассоциация на рельсах 5
модели
class User < ApplicationRecord
has_many :memberships
has_many :pages, through: :memberships
end
class Page < ApplicationRecord
has_many :memberships
has_many :users, through: :memberships
end
class Membership < ApplicationRecord
belongs_to :user
belongs_to :page
validates :page_id, uniqueness: { scope: :user_id}
end
Я могу создать несколько пользователей на страницах и страницы на пользователя, это как проверка не вызывается.
1 ответ
Решение
Для запуска проверок в связанной модели вам нужно использовать validates_associated
:
class User < ApplicationRecord
has_many :memberships
has_many :pages, through: :memberships
validates_associated :memberships
end
class Page < ApplicationRecord
has_many :memberships
has_many :users, through: :memberships
validates_associated :memberships
end
class Membership < ApplicationRecord
belongs_to :user
belongs_to :page
validates :page_id, uniqueness: { scope: :user_id}
end
Это может быть настоящей ошибкой, поскольку проверки ассоциаций не вызываются, когда они создаются неявно.
Кроме того, хорошей идеей является создание составного индекса базы данных, который предотвращает возможные условия гонки:
class AddCompoundIndexToMemberships < ActiveRecord::Migration[5.0]
def change
add_index :memberships, [:page_id, :user_id], unique: true
end
end
Это гарантирует на уровне БД, что нельзя создавать две одинаковые строки.