Ruby on rails 在Rails中,我可以在不更新数据库的情况下过滤一对多关系吗

Ruby on rails 在Rails中,我可以在不更新数据库的情况下过滤一对多关系吗,ruby-on-rails,ruby,activerecord,ruby-on-rails-5,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 5,我使用的是Rails 5,我希望能够过滤一对多关系,以便只向客户端发送子项的子集。数据模型非常标准,如下所示: 类父级

我使用的是Rails 5,我希望能够过滤一对多关系,以便只向客户端发送子项的子集。数据模型非常标准,如下所示:

类父级
当客户端进行调用时,我只想返回
父对象的一些
子实例

这也很复杂,因为返回
Child
对象的逻辑非常复杂,所以我用Ruby而不是数据库来完成

每当我执行类似以下的操作时,Rails都会尝试更新数据库以删除关联。我不想更新数据库。我只想在结果发送到客户端之前对其进行过滤

parent.children=parent.children.reject{| child | child.name.include?('foo')}

有没有办法做到这一点?

父模型中添加一个实例方法

def filtered_children
  children.where.not("name like ?", '%foo%')
end
调用
filtered\u children
在需要时,重置现有关联实例变量没有意义。相同的查询会被缓存,因此无论您调用它们一次还是多次都无关紧要。但您始终可以
记住方法的输出,以确保该方法不会在第二次之后再次求值

def filtered_children
  @filtered_children ||= children.where.not("name like ?", '%foo%')
end

希望有帮助

正在进行数据库更新,因为筛选的记录被分配回父项.children
。相反,可以使用另一个变量


filtered_children=parent.children.reject{| child | child.name.include?('foo')}

感谢您的回复。但我不确定这是否有用。这将执行一个全新的查询。这可能会被调用50多次。我想避免50次往返数据库。为了避免这种情况,我急切地加载所有的父实例和子实例。您到底想实现什么,相同的查询都会被缓存,所以无论您调用它们一次还是多次都无所谓。或者你可以将它们记忆起来,以避免被多次调用,检查我的编辑。实际上,我有三层一对多的关系。我想急切地请求所有的记录(包括一些额外的紧急呼叫)。然后,我想在可以进行单元测试的Ruby代码中过滤这些结果的每个级别。。。1.用简单数组替换ActiveRecord::Relation::CollectionsProxy。我一直不知道该怎么做。2.从数据库会话中分离所有实例。这似乎也是不可能的。这将不起作用,因为“拒绝”函数将修改数据库。@EvilJoe
reject
函数不会从数据库中删除。将剩余的对象分配给父对象。子对象将从db中删除。我确信它会这样做,因为这就是本文的提示。最后,我不得不创建新的类&将我的模型对象层次结构放在这些“服务器端可过滤”类中。然后,我对这些对象进行了筛选,因为它们使用的是规则数组而不是ActiveRecord代理。啊,你是对的,但我希望将对象保持在其当前结构中(其中一些被过滤掉)。结构复杂,重复的结构很容易维护。