请考虑以下事项:
-
budget
another_collection
中有许多object
。 -
obj
在其another_collection
中有许多与object
相同类型的对象。 -
budget
和some_collection
已在以下循环之前声明它们以前已保存在数据库中,并设置了主键。 -
some_collection
是obj
的集合。
-
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 更适合执行这些比较。但是,如果您的记录尚未保存,则需要执行类似上述操作的操作,因为记录尚未持久化。