【问题标题】:How to return a different active record based on some condition when an active record object is called?调用活动记录对象时,如何根据某些条件返回不同的活动记录?
【发布时间】:2018-04-25 13:15:36
【问题描述】:

产品型号有 id、name 和 master_product_id

master_prouduct_id 为 NULL 的产品本身就是主产品。

每当我加载产品对象时,我都需要返回 master_product。

我该如何实现?

我以为我可以通过 after_find 回调来完成这项工作。

但是在加载对象之后调用了after_find。

【问题讨论】:

    标签: ruby-on-rails activerecord callback


    【解决方案1】:

    您可以做的一种简单方法是,在模型中具有以下关系

    belongs_to :master_product, :foreign_key => : master_prouduct_id, :class_name => "Product"
    

    通过在任何产品对象上调用master_product,我们可以获得主对象。

    但是这个实现需要应用逻辑来处理是否调用master_product。

    别担心,我们可以按照下面的其他方式,

    Product < AR::Base
        def self.find(id)
            rec = super(id)
            rec.master_product_id ? super(rec.master_product_id) : rec
        end
    end
    

    但是,这样一来,我们就根本不会使用 find 来获取子产品,即使我们也想获取子产品。所以,我建议为此使用不同的函数名称,或者在查找定义中有一个标志来告诉需求。

    不过,您还需要处理其他场景(Where、Join、Association 等)。

    我不确定 Rails 是否对此有任何支持。

    【讨论】:

      猜你喜欢
      • 2016-06-03
      • 2017-02-05
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多