Rails根据关系验证列的唯一性

时间:2018-12-23 09:40:28

标签: ruby-on-rails spree

我有一个属于市场的产品表,并且有很多变型,每个变型都有SKU列,我想验证sku的唯一性,但要针对同一市场。我尝试过

validates :sku, uniqueness: { scope: :market_id }

但是由于变体没有market_id列,所以它不起作用!!,如何克服这个问题?!

2 个答案:

答案 0 :(得分:1)

尽管您可以从市场上访问变体, 如果你与你建立关系有很多经历,但是 我认为最好将market_id保存在变体表中并设置基于索引的两列

class Market < ApplicationRecord
  has_many :products
  has_many :variants , :through => :products
end

class Product < ApplicationRecord
  belongs_to :market
  has_many :variants
end

class Variant < ApplicationRecord
  belongs_to :Product
end

您可以生成迁移以在变量表中添加market_id 基于索引的两列 here is the reference 这是生成基于两个columnn(market_id和sku)的索引的代码

add_index(:variants, [:market_id, :sku], unique: true)

答案 1 :(得分:0)

变体属于某个市场中的产品,因此,为了避免在市场中检索产品的变体时进行额外的联接(这是一项昂贵的操作),并且为了实施此验证,模式的设计应使Variant既属于Market也属于Product

如果某个变体同时属于ProductMarket,则验证将如下所示

validates_uniqueness_of :sku, scope: [:market_id, :product_id]