我们有一个简单的商品和订单模型。
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 上
最佳答案
不,不可能添加 foreign key constraint执行正则表达式匹配 - 或除了简单相等之外的任何内容。请参阅 PostgreSQL documentation on constraints .
您可以做的是:
写一个constraint trigger在 PL/PgSQL 中执行您想要的约束;
拆分出要在应用程序中使用正则表达式添加约束的部分,并在仅包含该部分的列上定义外键约束;或者
使用
BEFORE INSERT OR UPDATE ... FOR EACH ROW
触发器在插入行时在 PL/PgSQL 中拆分出感兴趣的部分,并将感兴趣的部分添加到仅包含该部分的外键列。应用不需要知道重复,因为数据库在幕后处理它。
关于ruby-on-rails - 是否可以自定义外键以使用正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12016860/