Проверить уникальность атрибута таблицы ассоциации - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь добиться следующего:

  • Создайте валидатор, чтобы убедиться, что для каждого пользователя существует уникальное имя альбома.

Пожалуйста, смотрите мой код ниже:

Collaboration.rb

class Collaboration < ApplicationRecord

  # Relations
  belongs_to :album
  belongs_to :user

  # Validations
  validates_uniqueness_of :user_id, scope: [:album_id]
  validates_associated :user, :album
end

User.rb

class User < ApplicationRecord

  # Relations
  has_many :collaborations
  has_many :albums, through: :collaborations

end

Альбом

class Album < ApplicationRecord

  # Relations
  has_many :collaborations
  has_many :users, through: :collaborations

  # Validations
  validates :name, presence: true
end

albums_controller.rb

class AlbumsController < ApplicationController

  def create
    @album = current_user.albums.new(album_params)
    @album.collaborations.new(user: current_user, creator: true)
    if @album.save
      redirect_to user_albums_path(current_user), notice: "Saved."
    else
      render :new
    end
  end

  private

    def album_params
      params.require(:album).permit(:name)
    end
end

Я попробовал следующее в модели альбома:

  validates :name, uniqueness: { scope: :users }

, а также некоторые пользовательские валидаторы, такие как: https://github.com/rails/rails/issues/20676, работающие для вложенной формы, но все они безуспешно.

У меня нет идей .. Большое спасибо за вашу помощь

1 Ответ

0 голосов
/ 30 октября 2018

Хорошо, понял:

  validates_each :name do |record, attr, value|
    if Album.joins(:collaborations).where('name = ? and collaborations.user_id = ?', record.name.downcase, record.collaborations.first.user_id).present?
   record.errors.add :name, "Album name already exists for this user"
 end
...