我们有一个简单的物品和订单模型。
orders(url)
items(title, orders_count)
其中“url”可以是来自网络的任何网址,例如http://amzn.to/aCKiXO。我们想要做的是,如果用户输入“/ items / 7”作为“url”,那么它的行为就像一个外键。如下所示:
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
答案 0 :(得分:2)
不,不可能添加执行正则表达式匹配的foreign key constraint - 或者除了简单相等之外的任何内容。请参阅PostgreSQL documentation on constraints。
您可以做的是以下任何一项:
在PL / PgSQL中写一个constraint trigger来强制执行你想要的约束;
在应用程序中使用正则表达式拆分要添加约束的部分,并在仅包含该部分的列上定义外键约束;或
使用BEFORE INSERT OR UPDATE ... FOR EACH ROW
触发器在插入行时将感兴趣的部分拆分出PL / PgSQL,并将感兴趣的部分添加到仅包含该部分的外键列。该应用程序不需要知道重复,因为数据库正在幕后处理它。