请考虑以下事项:
budget
在其object
中有许多another_collection
个。 obj
在其object
中有许多与another_collection
相同类型的对象。 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
中的任何项目。由于此集合尚未保存到数据库中,因此结果中不会显示这些项目。 / p>
是否有一项功能或其他内容可以传递给Arel的where
方法,该方法使用本地结果仅?我知道我可以迭代这些项目并找到它但是如果我不必这样做并且只是使用已经执行此操作的方法那将会很棒。
答案 0 :(得分:1)
您总是可以使用Enumeable#select来获取一个块并仅返回该块返回true
的元素。您需要确保ActiveRecord首先检索结果集(通过在查询中调用to_a
)。
records = Model.where(some_attribute: value).to_a
filtered_records = records.select { |record| record.something? }
根据您的结果集和您的需求,第二个数据库查询可能会更快,因为您的SQL存储比Ruby更适合进行这些比较。但是如果你的记录还没有保存,你需要做类似上面的事情,因为记录还没有保留