我需要確保列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
create unique index ifriendz on friendz(greatest(from_id,to_id), least(from_id,to_id));
我試圖寫一個Rails遷移(我知道我可以使用普通的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支持它,但不是所有的數據庫。所以你試圖做的事情可能是不可能的。 –