0

来自this后&它说DB处理的参照完整性根本不是Rails方式。Rails 3中的Postgresql参照完整性约束条件

但想一想:

class User < ActiveRecord::Base 
    belongs_to :department 
end 

class Department < ActiveRecord::Base 
    has_many :users 
end 

#User Model 
id: integer, name: string,department_id: integer 
#Department Model 
id: integer, name: string 

在这里,我需要创建一个新的用户&强制执行以下规则

  • 用户应该被分配到一个部门
  • users.department_id应该匹配departments.id
  • if users.department_id与不匹配,不应创建记录&提出错误。

现在,我该如何在rails方式下完成这项工作?或者通过在迁移中删除原始SQL来添加外键是唯一的方法吗?允许保存操作之前

validates_presence_of :department 

Rails会检查是否有一个有效的部门:

+5

的‘Rails的方式’挂钩是头脑简单的,愚蠢的,并受竞争情况(其他中事情)。如果你关心你的数据,你会在数据库中使用真正的FK,[外国人](https://github.com/matthuhiggins/foreigner)会帮助你,直到Rails开始改变态度,良好的感觉。 –

+0

是的,它似乎很奇怪,但嘿,铁轨是一个固执己见的软件:) – CuriousMind

+0

但是他们的逻辑有漏洞,他们让他们的态度得到坚实的软件的方式。至少他们承认他们在[验证指南](http://guides.rubyonrails.org/active_record_validations_callbacks.html#why-use-validations)中唯一性的缺点。我已经看到了足够*不可能*事情发生得更好,我至少和Rails一样被认为是:) –

回答

1

在Rails中,你只需添加到您的用户模型。如果你愿意的话,你也可以像老外一样使用宝石来为你的表添加外键。我通常这样做是因为我不可避免地发现自己需要在某个时候直接批量加载数据。

+0

我已经有了这个验证,但我正在验证'department_id'。将其更改为“部门”,现在它可以工作。但我想知道它为什么现在起作用并且没有提前工作? – CuriousMind

+0

如果您验证ID的存在,请确保ID字段已填充,但如果ID实际引用现有的行,则不能。通过验证关联,确保有一个由该ID引用的匹配行。 –

1

如果卢卡斯的回答不适合你的需求,你也可以使用前/后保存在模型上

class User < ActiveRecord::Base 

    before_save :validate_department 

    def validate_department 
    #validate the department 
    #raise an error if invalid? 
    end 

end