【问题标题】: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 是否对此有任何支持。