Rails 和 Arel's where 函数:我可以在对象上调用 where 而不是调用数据库吗?



请考虑以下事项:

  • budget another_collection中有许多object
  • obj在其another_collection中有许多与object相同类型的对象。
  • budgetsome_collection 已在以下循环之前声明它们以前已保存在数据库中,并设置了主键。
  • some_collectionobj的集合。

-

some_collection.each do |obj|
  another_obj = obj.another_collection.build
  budget.another_collection << another_obj
end
budget.another_collection.collect {|another_obj| another_obj.another_obj_id}
=> [1, 2, 3, 4]
some_obj_with_pk_1 = some_collection.where(obj_id: obj.id)
some_obj_with_pl_1.id
=> 1
budget.another_collection.where(another_obj_id: some_obj_with_pk_1.id)
=> []

这不应该发生。正在发生的事情是,rails 在数据库中查询 another_obj_id = 1 的 another_collection 中的任何项目。由于此集合尚未保存到数据库,因此这些项都不会显示在结果中。

是否有一个函数或东西我可以传递给 Arel 的 where 方法,说使用本地结果?我知道我可以迭代项目并找到它,但是如果我不必这样做并且只是使用已经执行此操作的方法,那就太好了。

你总是可以使用Enumeable#select,它接受一个块,只返回块返回true的元素。您需要确保让 ActiveRecord 首先检索结果集(通过对查询调用 to_a)。

records = Model.where(some_attribute: value).to_a
filtered_records = records.select { |record| record.something? }

根据您的结果集和需求,第二个数据库查询可能会更快,因为您的 SQL 存储比 Ruby 更适合执行这些比较。但是,如果您的记录尚未保存,则需要执行类似上述操作的操作,因为记录尚未持久化。

相关内容

  • 没有找到相关文章

最新更新