在Ruby on Rails中,我如何告诉模型它应该有一个涵盖两个不同字段的唯一约束?

时间:2013-10-03 20:45:03

标签: ruby-on-rails ruby

我正在开发一个专门用于分享故事的网站,这是我学习Ruby on Rails的一部分。我已经设法完成了很多步骤,但我仍然坚持如何在模型的两个属性上创建一个唯一约束。

我能够创建一个数据库级唯一性约束,这应该有帮助,但'rails方式'说我需要在模型中创建它,数据库约束只是并行的情况下的备份问题(经典的“用户双击按钮”方案)。

我的问题可以被认为等同于创建第二个主键,它恰好是对象中两个变量的组合。也就是说,我实际上并不想取代'自然'复合键,实际上对将它留在原地非常满意。在大多数情况下,我更喜欢使用唯一ID来识别表中的每个对象。

那就是说,出于这个应用程序的目的,我需要一种方法来跨两列定义唯一性约束。故事可以重复,章节号可以重复,但是你永远不能复制给定故事的给定章节号。故事可以有一个,只有一个章节。当然,仅仅因为它的编号为1并不意味着它的标题为第一章;它可能是序幕。或者第零章。管他呢。这个数字仅用于(或者,一旦我到达那里),以帮助创建一个“干净”的网址。我不介意storyID相当高,或者对于给定的一组故事而言,它们具有非顺序ID。没关系。但是我认为,当他从故事的第一章到第二章时,从故事/ 1 /章/ 32到故事/ 1 /章512,这将是令人困惑的。

我试过了:

validates [:story_id, :number], uniqueness:true

但它不起作用 - 它不能从数组中生成符号。所以我不知道该怎么办。

1 个答案:

答案 0 :(得分:7)

validates :number, uniqueness: {scope: [:story_id]}

这将对具有story_id范围的数字强制执行唯一性验证。这意味着您的号码对于给定的story_id将是唯一的。