[英]Have unique constraint between tables
我需要驗證一個元素的唯一性,但是每個元素可以具有n
代碼,並且需要對此進行驗證。 元素應在類型,提供者,時間和代碼方面唯一。 創建元素時,如果其中任何代碼與現有元素代碼重疊,則表示該元素具有代碼數組,這意味着該元素相同。
例如有
代碼
| id | code|
|:-------| ---:|
| 1 | 123 |
| 2 | 456 |
分子
| id | type | provider_id | time |
|:-------|:-------------:| ------------:|-----------:|
| 1 | A | 1 | 01/01/2016 |
codes_elements
| code_id | element_id |
|:--------|------------:|
| 1 | 1 |
期望:
當我嘗試插入時:
`Element = type: A, provider: 1, codes: [1], time: 01/01/2015`
我希望這會失敗,因為違反了禁忌素
當我嘗試插入時:
`Element = type: B, provider: 1, codes: [1], time: 01/01/2015`
我希望這會創建一個具有代碼關系的新元素
當我嘗試插入時:
`Element = type: A, provider: 1, codes: [2], time: 01/01/2015`
我希望這會創建一個新元素,因為元素相同,但代碼數組不會與任何其他元素重疊
當我嘗試插入時:
`Element = type: A, provider: 1, codes: [1, 2], time: 01/01/2015`
我希望此添加關系僅在code_elements中,因此元素1現在將具有2個代碼,因為代碼1與其他元素重疊,這意味着這是相同的元素,因此我只需要包含代碼2
我看到的選項
將聯接表更改為元素表中的int數組。-在這種情況下,我可以按其他列進行搜索並附加代碼ID,還可以按代碼數組創建condin,以防止重復。 問題是當我通過代碼查詢元素表很慢時,例如用代碼1獲取所有元素。
創建觸發器,並檢查代碼是否與其他元素重疊,如果不創建新元素,則僅分配代碼關系。
我正在使用Ruby on Rails,但是我需要模型驗證是不夠的,因為我有多個線程同時執行插入操作,並且可能以重復操作結束
我想了解有關當前想法的更好選擇或評論,以期改善性能,防止重復等。
為什么不在RoR中設置驗證?
如果重復該元素,則無論如何都會出現錯誤消息。 如果重復,您可以在RoR中處理錯誤並在元素的末尾添加“ 1”之類的字符。 另一個選項是在codes_elements表中創建“合並”列,然后將element + code值保存在其中。
編輯:
您可以確定不使用事務保存重復的行:
ActiveRecord::Base.transaction do
elements.code do |c|
Element.find_or_create_by(code: c, element: e)
or
Element.exists? code: c, element: e
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.