1

我们有一个简单的项目和订单模型。

orders(url)
items(title, orders_count)

其中“url”可以是来自网络的任何 URL,例如http://amzn.to/aCKiXO。我们想要做的是,如果用户为“url”输入“/items/7”,那么它的行为就像外键一样。所以像:

class Order < ActiveRecord::Base
  belongs_to :item, :foreign_key => :url, :regex => /items/n, 
                    :counter_cache => true
end

class Item < ActiveRecord::Base
  has_many :orders, :foreign_key => :url, :regex => /items/n, 
                    :dependent => :destroy
end

这可能吗?我们在 Rails 2.3.8、Ruby 1.9.3 和 Postgresql 9.1 上

4

1 回答 1

2

不,不可能添加执行正则表达式匹配的外键约束- 或者除了简单相等之外的任何内容。请参阅有关约束的 PostgreSQL文档。

可以做的是:

  • 在PL/PgSQL中编写一个约束触发器来强制执行你想要的约束;

  • 拆分出您要在应用程序中使用正则表达式添加约束的部分,并在仅包含该部分的列上定义外键约束;或者

  • 当插入行时,使用BEFORE INSERT OR UPDATE ... FOR EACH ROW触发器在 PL/PgSQL 中将感兴趣的部分拆分出来,并将感兴趣的部分添加到仅包含该部分的外键列中。该应用程序不需要知道重复,因为数据库在幕后处理它。

于 2012-08-18T08:05:14.720 回答