Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 拒绝嵌套的关联创建轨道_Ruby On Rails_Ruby On Rails 4_Activerecord - Fatal编程技术网

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