如何在调用活动记录对象时根据某些条件返回不同的活动记录?

时间:2018-04-25 13:15:37

标签: ruby-on-rails activerecord callback

产品型号有id,name和master_prouduct_id

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

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

我该如何实现?

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

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

1 个答案:

答案 0 :(得分:3)

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

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,Joins,Associations等)。

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