2012-09-27 107 views
1

我在我的Rails项目中有两个模型(和表)。每个模型都有一个“地址”字段。ActiveRecord - 防止重复表中的条目

目前,我有我的代码集来验证每个模型中地址的唯一性,并且在每个表上都有一个地址索引,以防止多重连接尝试保存相同数据时出现重复。

但是,我想确保在两个表之间唯一的地址字段是。如上所述,如果地址存在于一个表格中,则无法将其保存到第二个表格中。

解决代码中的问题并不难,但是如何在数据库级别(类似于索引)实现该检查以确保不会保存非唯一值?

+1

如果您的问题是关于«数据库级别»,我建议您更新您的标签和标题并指定您的DBMS。如果它是MySQL那么 - http://stackoverflow.com/questions/1452097/implementing-unique-across-linked-tables-in-mysql。但我宁愿用自定义验证方法解决这个问题 - 非常简单。 – jibiel

+0

您的数据库设计错误。 http://en.wikipedia.org/wiki/Database_normalization –

回答

0

在两个表中写入自定义验证器。 custom validation rails guide是开始的好地方。 在自定义验证器中,如果该值已经存在于另一个表地址字段中,则可以引发错误。

+0

我真的希望我也可以在数据库级别实施这种独特性,但我认为自定义验证将是我能做的最好的。 – Bryce

2

你最好创建一个地址表,它可以负责维护自己的唯一性。而不是在其他模型上维护地址字段,而是提供关联。它可以按如下方式完成:

class Home < ActiveRecord::Base 
    belongs_to :address 
end 

class Office < ActiveRecord::Base 
    belongs_to :address 
end 

class Address < ActiveRecord::Base 
    attr_accessible :body 
    validates :body, uniqueness: true 

    has_many :homes 
    has_may :offices 
end 
+0

我对协会很熟悉,但在这种情况下,这不适用于我。正如我所说的那样,是否有任何方法可以解决问题? – Bryce