如何在Rails中建立协会以接受一个提案?

问题描述

我正在Rails应用程序中开发一项功能,该功能允许users创建projects。然后,其他用户可以创建proposals。最后,创建项目的用户可以接受其中一个提案作为接受的提案。

什么是允许创建项目的用户(经理)选择其中一个提案作为接受的提案的最佳方法

模型设置如下:

用户模型

class User < ApplicationRecord
  has_many :projects
  has_many :proposals
end

项目模型

class Project < ApplicationRecord
  belongs_to :manager,class_name: 'User',foreign_key: :user_id
  has_many :proposals
end

投标模型

class Proposal < ApplicationRecord
  belongs_to :project
  belongs_to :user
end

首先,我想到了投标表中的“接受”布尔值,该布尔值允许用户将布尔值标记为true,以使投标“接受”。但这可能会导致问题,例如某些项目的建议书不只一个。这不是正确的方法

那么,我应该如何建立一个接受模型,允许经理选择和取消选择一个提案作为唯一的“接受”提案?

解决方法

如果您要100%确保没有一个项目可以接受一个以上的建议,则可以设置其他关系。您还需要在投标中添加另一个关系

class Project < ApplicationRecord
  belongs_to :accepted_proposal,class_name: 'Proposal',inverse_of: :accepted_for,optional: true
end

class Proposal < ApplicationRecord
  has_one :accepted_for,class_name: 'Project',inverse_of: :accepted_proposal
end

您还可以仅验证已接受提案的唯一性,但我认为您不能为此提供数据库唯一索引

class Proposal < ApplicationRecord
  validates :project_id,:uniqueness,if: Proc.new { |proposal| proposal.accepted }
end