【问题标题】:Delete if just one record in the join table in rails如果在 rails 的连接表中只有一条记录,则删除
【发布时间】:2021-05-18 14:04:15
【问题描述】:

我有两个表用户和办公室

用户.rb

has_many :offices

office.rb

belongs_to :user

然后我有 officeuser 表,其中有 office_id 和 user_id 字段。

我正在尝试为类似这样的办公室创建销毁操作。

officer_controller.rb

def destroy
  render json: {}, status: :unprocessable_entity unless office.destroy
end

private

def office
  @office ||= Office.find(params[:id])
end

在销毁操作中,如果只有一个办公室与用户关联,我也想删除该用户。所以基本上删除用户,如果没有其他办公室那么属于用户,否则不要删除用户。

【问题讨论】:

  • 听起来办公室和用户之间应该有一个 has_and_belongs_to_many 关联,特别是因为你提到了一个连接模型。如果它像您描述的那样是多对一的,那么您不需要连接模型。
  • @Joel_Blum 一个办公室只能属于一个用户。但一个用户可以有多个办公室
  • 是的,这被称为多对一,您不需要为此连接表 (officeuser)。由于 office 只能属于一个用户,因此在 office 上有一个 user_id 就足够了。

标签: ruby-on-rails ruby-on-rails-5


【解决方案1】:

office销毁成功后,可以查看用户是否链接到其他office,判断是否也销毁该用户:

# office.rb
after_destroy :destroy_no_office_user_as_well

private

def destroy_no_office_user_as_well
 user.destroy if user.offices.empty?
end

如果您担心该用户同时拥有新办公室怎么办,则可以将销毁逻辑移至用户类并使用锁定检查。

【讨论】:

  • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 2011-10-13
  • 2020-06-29
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多