Rails 3中的Postgresql参照完整性约束

时间:2012-05-30 08:11:04

标签: ruby-on-rails ruby-on-rails-3 postgresql database-design activerecord

this帖子&它说数据库处理的参照完整性根本不是Rails方式。

但请考虑一下:

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

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

  • 应将用户分配到某个部门
  • users.department_id应与departments.id
  • 相匹配
  • 如果users.department_iddepartments.id不匹配,则不应创建记录&amp;提出错误。

现在,如何以rails方式完成此操作?或者通过在迁移中删除原始SQL来添加外键只是一种方法?

2 个答案:

答案 0 :(得分:1)

在Rails中,您只需将其添加到您的用户模型中:

validates_presence_of :department

Rails将在允许保存操作之前检查有效的部门。如果您愿意,您也可以像外国人一样使用宝石来为表添加外键。我通常这样做是因为我不可避免地发现自己需要在某个时刻直接批量加载数据。

答案 1 :(得分:1)

如果Lukas的回答不能满足您的需求,您也可以在模型上保存钩子之前/之后使用

class User < ActiveRecord::Base

  before_save :validate_department

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

end