ruby-on-rails - 唯一性验证不适用于 has_many :though association on rails 5

标签 ruby-on-rails ruby validation has-many-through validates-uniqueness-of

模型

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

能够在页面和用户页面上创建多个用户,就像没有调用验证一样。

最佳答案

要触发关联模型中的验证,您需要使用 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

这可能是一个真正的问题,因为在隐式创建关联时不会调用关联验证。

此外,创建一个复合数据库索引是一个好主意,可以防止 possible race conditions :

class AddCompoundIndexToMemberships < ActiveRecord::Migration[5.0]
  def change
    add_index :memberships, [:page_id, :user_id], unique: true
  end
end

这确保在数据库级别上不能创建两个相同的行。

关于ruby-on-rails - 唯一性验证不适用于 has_many :though association on rails 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46446937/

相关文章:

ruby-on-rails - Rails中的自定义错误页面?

ruby-on-rails - Ruby on Rails - 将参数传递到 routes.rb 中的 301 重定向

ruby-on-rails - 对于数组中的第一个 x?

asp.net - 我的团队成员不支持使用 asp.net 中提供的验证控件(对于 Web 应用程序)

jquery - Chrome 10 必填字段问题 (jQuery)

sql - Rails 有 activerecord 一次性获取所有需要的关联吗?

sql - 多个 has_many 关系 Rails SQL 查询

ruby-on-rails - Rails 4 嵌套浅层路由 : how to get parent id in child controller?

ruby - 为所有新实例禁用 net::http 的 use_ssl

python - 国际电话号码验证