【问题标题】:Rails 5.0 - How to check if record is associated on another table?Rails 5.0 - 如何检查记录是否与另一个表关联?
【发布时间】:2017-03-10 12:29:17
【问题描述】:

在销毁一条记录之前,我想检查一下它在其他表上是否有任何用途,即使记录本身不知道这些用途

例如,假设我有一个cost_centers 的表,我有一个areas 的表。

area 有一个默认的cost_centercost_centersareas没有联系。

我可以使用哪种validation 来防止用户破坏cost_center,以保持area 的一致性?

换句话说,我如何在数据库中搜索以找出该记录是否是任何其他表上其他记录的外键?

【问题讨论】:

    标签: ruby-on-rails database postgresql validation ruby-on-rails-4


    【解决方案1】:

    当您设计数据库时,您可能已经设置了所有引用。 在您的迁移中,它看起来像这样:t.references :cost_center

    如果是这样,您的成本中心模型可能与每个包含引用的表具有 has_one 关系,在您的示例中,引用为 has_one :area

    然后,要检查它是否被实际使用,您可以对一个方法进行before_destroy 回调,以检查任何has_one 定义是否不为空:

    class CostCenter < ActiveRecord::Base
      has_one :area
      before_destroy :check_usage
    
      def check_usage
        !self.area.nil?
      end
    end
    

    【讨论】:

    • 但是我需要让成本中心知道使用它的每个模型,对吗?是否不可能有一个由其他表消耗的成本中心“池”,而成本中心却忽略了其他表?
    • 嗯,这里有两个方面:数据库和 Rails。在数据库中,我强烈建议为完整性设置所有references。然而,在 Rails 中,您不必强制使用 has_one 指令。但是,要使您的想法生效,您需要知道谁在使用您的模型,因为可能有很多其他模型在使用它。不仅如此,因为你的CostCenter 模型是核心部分,它确实应该处理这个逻辑,否则即使你使用concerns,你也会有很多重复的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多