ruby-on-rails - 验证关联表属性的唯一性
问题描述
我正在努力实现以下目标:
- 创建一个验证器以确保每个用户都有一个唯一的专辑“名称”。
请在下面查看我的代码:
协作.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
用户.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
专辑控制器.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适用于嵌套形式,但所有这些都没有成功。
我没有想法..非常感谢您的帮助
解决方案
好的,我知道了 :
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
推荐阅读
- java - Android Java - 遍历用户的图库
- android - Android imageview 性能,布局中的 1 或 3 个图像?
- c# - 我创建了一个 for 循环,但它不起作用,但是 while 循环可以,有什么建议吗?
- unity3d - Unity Gameobject 在 Hololens 2 中不可见
- c++ - 如何使用可变参数注册回调并传递值
- pyqt5 - 使窗口的一部分在视觉上透明并且对于鼠标输入也是透明的
- c++ - 是否应该在程序结束时调用 FreeLibrary?
- stm32 - 为什么stm32使用ICER=1而不是ISER=0来禁用中断?
- android - 在 LinearLayout 的屏幕上点添加视图
- c# - 自定义 IOptionsFactory 中的奇怪 ThreadAbortException
仅在调试时?