51 lines
1.3 KiB
Ruby
51 lines
1.3 KiB
Ruby
Sequel.migration do
|
|
up do
|
|
create_table(:memberships) do
|
|
primary_key :id, type: :Bignum
|
|
|
|
foreign_key :member_id, :members,
|
|
type: :Bignum,
|
|
null: false,
|
|
on_delete: :cascade
|
|
|
|
String :status, null: false, default: "pending"
|
|
|
|
DateTime :requested_at,
|
|
null: false,
|
|
default: Sequel::CURRENT_TIMESTAMP
|
|
|
|
DateTime :decided_at
|
|
|
|
foreign_key :recorded_by, :members,
|
|
type: :Bignum,
|
|
null: true,
|
|
on_delete: :set_null
|
|
|
|
index :member_id, name: :memberships_member_id_all_index
|
|
index :recorded_by
|
|
index :status
|
|
|
|
# Un seul dossier en attente ou une seule adhésion acceptée.
|
|
index :member_id,
|
|
unique: true,
|
|
name: :memberships_active_member_id_index,
|
|
where: { status: ["pending", "accepted"] }
|
|
|
|
constraint :memberships_status_valid,
|
|
Sequel.lit("status IN ('pending', 'accepted', 'rejected')")
|
|
|
|
constraint :memberships_decision_consistent,
|
|
Sequel.lit(
|
|
"(status = 'pending' AND decided_at IS NULL " \
|
|
"AND recorded_by IS NULL) " \
|
|
"OR (status IN ('accepted', 'rejected') " \
|
|
"AND decided_at IS NOT NULL)"
|
|
)
|
|
end
|
|
end
|
|
|
|
down do
|
|
drop_table(:memberships)
|
|
end
|
|
end
|