1

シンプルなアイテムとオーダーモデルをご用意しております。

orders(url)
items(title, orders_count)

ここで、「url」はhttp://amzn.to/aCKiXOなどの 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

これは可能ですか?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で関心のある部分を分割し、その部分のみを含む外部キー列に関心のある部分を追加します。DB が舞台裏で重複を処理しているため、アプリは重複について知る必要はありません。

于 2012-08-18T08:05:14.720 に答える