列requester_id
とaccepter_id
の表friendships
内で双方向の一意性を確保する必要があります。考慮すべき解決策としてRailsの移行でGREATESTとLEASTを使用するにはどうすればよいですか?
Table: friendships
requester_id | accepter_id
--------------------------
1 | 2
2 | 1 <-- this should not be possible
、私はこのアプローチを見つけた:Postgresql enforce unique two-way combination of columns私はRailsのマイグレーションを記述しようとしています
create unique index ifriendz on friendz(greatest(from_id,to_id), least(from_id,to_id));
(私は私もプレーンなSQLを使用することができます知っているが、私は持っていたいですそれはきれいです)。
これは私のコマンドを書き直そうとしたものです。それは動作しません。
class AddBidirectionalUniqueConstraintToFriendships < ActiveRecord::Migration
def change
add index :friendships, greatest[:requester_id, :accepter_id], least[:requester_id, :accepter_id], unique: true
end
end
私はRailsのActiveRecordのについての事を知らないが、それは他のほとんどのORMフレームワークのようであれば、それはおそらくほとんどがANSI風味に制限されていますSQL機能。 「最大」および「最小」機能は、データベース特有のものです。 PostgresとMySQLはそれをサポートしますが、すべてのデータベースをサポートしません。だからあなたがしようとしていることは不可能かもしれません。 –