Ruby on rails 拒绝嵌套的关联创建轨道
我有两个模型,如下所示 根据建议更新Ruby on rails 拒绝嵌套的关联创建轨道,ruby-on-rails,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby On Rails 4,Activerecord,我有两个模型,如下所示 根据建议更新 class用户
class用户
及
class CompanyUser
我发现唯一性验证只在更新
请求上起作用。在create
上,请求验证不起作用,它只是绕过它
如果用户不止一次分配了相同的公司和角色,我希望启用相同的验证以拒绝。如果要确保用户在唯一对:company和:role上的唯一性,则可以尝试以下操作。默认情况下,对create和update运行验证。您不需要
:on=>[:创建,:更新]
。所以应该是:
validates :user, uniqueness: {scope: [:company, :role]}
从
:on选项接受一个值:create
或:update
--
验证只在create
或update
上运行,对吗
find
不操纵数据库,destroy
清除记录&new
只调用对象的新实例。事实上,你没有其他理由去验证
所以,真的,你应该:
validates :user, uniqueness: {scope: [:company_id, :role_id]}
这将查找company\u id
和role\u id
中的值,这可能比调用company
和role
对象本身更有效
我可能错了,但我真的认为,如果你使用上述方法,它应该会起作用
--
您可能还希望清理您的模型:
class User < ActiveRecord::Base
has_many :company_users, dependent: :destroy, inverse_of: :user
accepts_nested_attributes_for :company_users, allow_destroy: true
has_many :companies, through: :company_users
has_many :roles, through: :company_users
end
class CompanyUser < ActiveRecord::Base
belongs_to :company
belongs_to :role
belongs_to :user, inverse_of: :company_users
validates :user, uniqueness: {scope: [:company_id, :role_id]}
end
class用户
通过以下验证解决了此问题
class User < ActiveRecord::Base
has_many :company_users, dependent: :destroy, inverse_of: :user
accepts_nested_attributes_for :company_users, allow_destroy: true
has_many :companies, through: :company_users
has_many :roles, through: :company_users
validate :company_users, :uniqueness_of_company_users
end
private
def uniqueness_of_company_users
errors.add(:company_users, 'error in role creation') if company_users.map{|x| "#{x.company_id} #{x.role_id}"}.uniq.size != company_users.size
end
class用户
这是解决问题所需的附加验证
感谢Rich Peck提供此功能对不起,我应该删除=>[:创建,:更新]上的
,是的,我同意,这应该非常有效。但事实并非如此。根据这一点,它还表示对嵌套属性进行验证。它根本不会启动?不,仍然create
可以使用重复的entries启动,并且您正在使用:company\u id,:role\u id
或:company,:role
?一些有趣的东西
class User < ActiveRecord::Base
has_many :company_users, dependent: :destroy, inverse_of: :user
accepts_nested_attributes_for :company_users, allow_destroy: true
has_many :companies, through: :company_users
has_many :roles, through: :company_users
end
class CompanyUser < ActiveRecord::Base
belongs_to :company
belongs_to :role
belongs_to :user, inverse_of: :company_users
validates :user, uniqueness: {scope: [:company_id, :role_id]}
end
class User < ActiveRecord::Base
has_many :company_users, dependent: :destroy, inverse_of: :user
accepts_nested_attributes_for :company_users, allow_destroy: true
has_many :companies, through: :company_users
has_many :roles, through: :company_users
validate :company_users, :uniqueness_of_company_users
end
private
def uniqueness_of_company_users
errors.add(:company_users, 'error in role creation') if company_users.map{|x| "#{x.company_id} #{x.role_id}"}.uniq.size != company_users.size
end