我可以列出对象(例如用户)的所有从属对象吗?

时间:2019-05-09 16:06:04

标签: ruby-on-rails

我有一个模型,可以手动检查每个(:has_many:has_one)依赖关系,但是我想要记录像current_user.attributes这样的魔术。因此,当我更新模型时,不需要更新方法。

我尝试过Reflections,但是它返回了模型的所有理论依赖关系/连接,不是吗?我需要来自数据库的相关记录。

类似X.where(user_id: @user.id)@user.dependents

有可能吗?

2 个答案:

答案 0 :(得分:2)

您可以将必需的对象分配给model,然后

model.class.reflect_on_all_associations.map { |table| model.method(table.name).call }.select(&:any?)

例如:

user = User.first
user.class.reflect_on_all_associations.map { |table| user.method(table.name).call }.select(&:any?)
# returns all associated objects of first user

您可以使用:has_many:has_one:belongs_to作为reflect_on_all_associations的参数来指定结果。

可能还有更优雅的方法,但是它可行。

答案 1 :(得分:1)

TL; DR不要这样做:)

您可以使用反射执行类似的操作。例如

@user.class.reflections.keys.flat_map { |reflection| me.send(reflection) }

将为您提供一个数组,其中包含与用户关联的所有对象。但是下一步是什么?

对于此列表成员周围的几乎任何现实世界逻辑(AR :: Base的基础知识除外),您将必须检查对象的类或使用容易出错的{ {1}}魔术-有时这两种选择都是合理的权衡取舍,但是在大多数实际情况下,我宁愿使用气味较弱的解决方案(即使它们有些冗长)。