2015-12-19 26 views
0

我有如下2種型號,拒絕嵌套assosciation創作軌

更新的基礎上建議

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, :role]} 
end 

我找到的唯一性驗證的唯一工作update請求。在create請求驗證不起作用,它只是繞過它。

我想啓用相同的驗證,以拒絕用戶是否有多次分配同一個公司&角色。

回答

1

解決了以下驗證這個問題,

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 

這是解決所需的額外的驗證問題

感謝Rich Peck爲此https://railscoding.wordpress.com/2015/04/27/uniqueness-gotcha/

+0

好的工作,我upvoted它 –

1

如果您希望確保用戶在唯一對公司和:角色上的唯一性,那麼您可以嘗試以下操作。默認情況下,驗證針對創建和更新都運行。你不需要:on => [ :create, :update ]。因此,它應該只是:

validates :user, uniqueness: {scope: [:company, :role]} 
+0

謝謝,但它不工作。我曾嘗試過。 – anoop

+0

我高舉,因爲它應該工作 –

0

docs

的:在選項採用值一個:create:update

-

的確認是只有運行o反正是createupdate吧?

find不操縱分貝,destroy擺脫記錄& new只是調用對象的新實例。你幾乎沒有其他的理由來驗證。

所以,真的,你應該有:

validates :user, uniqueness: {scope: [:company_id, :role_id]} 

這將查找對值company_idrole_id,這可能會比調用companyrole對象本身更有效。

我可能是錯的,但我真的認爲如果你使用上述,它應該工作。

-

你也不妨來清理你的模型:

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 
+0

對不起,我應該已經刪除'on => [:create,:update]',是的,我同意,這應該是理想的工作。但不是。根據這個[鏈接](http://homeonrails.com/2012/10/validating-nested-associations-in-rails/)它也說明了對嵌套屬性的驗證。 – anoop

+0

它只是不開火? –

+0

不,仍然'創造'可以複製條目觸發 – anoop