【发布时间】:2011-01-24 19:39:54
【问题描述】:
我想在我的 Rails 应用程序中使用 ActiveRecord,但我想在 PostgreSQL 数据库中而不是在 ActiveRecord 模型中编码数据约束。
例如,如果我有一个由脚手架生成的模型,
rails generate scaffold User name:string email:string yearofbirth:integer
我想确保名称足够长。例如
class User < ActiveRecord::Base
validates :name, :length => { :maximum => 140 }
validates_uniqueness_of :name
validates_numericality_of :yearofbirth, :greater_than_or_equal_to => 1900
end
这些验证很好,因为如果尝试添加错误数据,ActiveRecord 会向视图抛出一些很好的错误消息。
但是,我想在数据库本身中对规则进行编码,并让数据库向 ActiveRecord 抛出同样漂亮且信息丰富的错误消息,然后将它们传递给视图层。例如,
create table "Users" (
id integer unique,
name varchar(140) unique check(length(name)<140),
email varchar(255),
yearofbirth integer check (yearofbirth >= 1900)
);
我需要在 PostgreSQL 或 ActiveRecord 中做什么才能实现这一点?当我使用 pgAdmin III 工具尝试它时,它会抛出错误消息,但我想自定义它们。
另外,有没有办法将这些数据库规则直接编码到 Ruby 中的数据库迁移文件中?
感谢您给我的任何帮助。
【问题讨论】:
-
+1:对数据的约束应该始终在数据库中,然后自动添加到 ActiveRecord 模型中。 Rails 和 ActiveRecord 只是访问我们数据的一种方式,而不是唯一的强制检查点。这确保了完整性并尊重 DRY 原则。因此,您的问题很有趣,任何好的答案也会很有趣。
标签: ruby-on-rails-3 postgresql database-design activerecord