Проверка уникальности не работает на 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

Это гарантирует на уровне БД, что нельзя создавать две одинаковые строки.

Другие вопросы по тегам