是否可以自定义外键以使用正则表达式

时间:2012-08-18 07:42:53

标签: ruby-on-rails ruby regex postgresql activerecord

我们有一个简单的物品和订单模型。

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

1 个答案:

答案 0 :(得分:2)

不,不可能添加执行正则表达式匹配的foreign key constraint - 或者除了简单相等之外的任何内容。请参阅PostgreSQL documentation on constraints

可以做的是以下任何一项:

  • 在PL / PgSQL中写一个constraint trigger来强制执行你想要的约束;

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

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