Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否可以自定义外键以使用正则表达式_Ruby On Rails_Ruby_Regex_Postgresql_Activerecord - Fatal编程技术网

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

Ruby on rails 是否可以自定义外键以使用正则表达式,ruby-on-rails,ruby,regex,postgresql,activerecord,Ruby On Rails,Ruby,Regex,Postgresql,Activerecord,我们有一个简单的项目和订单模型 orders(url) items(title, orders_count) 其中“url”可以是来自web的任何url,例如。我们想做的是,如果用户为“url”输入“/items/7”,那么它的行为就像一个外键。比如: class Order < ActiveRecord::Base belongs_to :item, :foreign_key => :url, :regex => /items/n,

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

orders(url)
items(title, orders_count)
其中“url”可以是来自web的任何url,例如。我们想做的是,如果用户为“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
类顺序:url,:regex=>/items/n,
:counter_cache=>true
结束
类项:url,:regex=>/items/n,
:dependent=>:destroy
结束

这可能吗?我们使用的是Rails 2.3.8、Ruby 1.9.3和Postgresql 9.1。不,不可能添加一个正则表达式匹配的函数,也不可能添加除简单等式以外的任何函数。参见PostgreSQL

您可以执行以下任一操作:

  • 在PL/PgSQL中编写一个命令来强制执行所需的约束

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

  • 在插入或更新之前使用
    。。。对于每一行
    在插入行时触发在PL/PgSQL中拆分感兴趣的部分,并将感兴趣的部分添加到仅包含该部分的外键列中。应用程序不需要知道复制的情况,因为DB正在幕后处理它


如果编写约束触发器,请小心并发问题。您可能需要执行显式锁定或更新冗余数据以防止竞争条件;或者仅使用
可序列化的
事务进行自动保护,使其免受竞争条件的影响。