如何使用其他表

时间:2017-03-02 12:42:22

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 has-many-through

我有两个模型CompanyAsset和一个联接模型CompanyAsset,关联如下:

class Company < ActiveRecord::Base
  has_many :company_assets
  has_many :assets, through: :company_assets    
  accepts_nested_attributes_for :company_assets, allow_destroy: true
end

class Asset < ActiveRecord::Base
  has_many :company_assets
  has_many :companies, through: :company_assets

  validates :label, uniqueness: true
end

class CompanyAsset < ActiveRecord::Base
  belongs_to :company
  belongs_to :asset
  accepts_nested_attributes_for :asset, allow_destroy: true
end

我想验证label的{​​{1}}属性的唯一性,以便唯一性特定于Asset

例如: Company-A Company-B

公司-A 只有一个Company Asset Asset-A 。现在系统应该允许我为 Company-B 创建 Asset-A ,但是不应该允许为公司再次创建 Asset-A -A

label将不允许在任何validates :label, uniqueness: true

中创建具有相同标签的Asset

我正在创建Company条记录

Asset

现在我要为 Company-B

创建 Asset-A
a =  Company.find(1) // Company-A
a.update(company_assets_attributes: [{info: 'pqr', asset_attributes: {label: 'Asset A'}}])

关于如何处理唯一性的任何想法?

2 个答案:

答案 0 :(得分:0)

您可以在标签上添加ActiveRecord自定义验证程序,查找相同的标签,company_id对。

在CompanyAsset上:

validate :asset_label_must_be_unique
  def asset_label_must_be_unique
    errors.add(:base, 'Must unique') unless CompanyAsset.joins(:assets).where('assets.label' => asset.label).where(company_id: company_id).none?
  end

答案 1 :(得分:0)

您可以这样做:

  

验证:标签,唯一性:{scope :: company_id}