Rails和Arel的功能:我可以调用对象的位置而不是调用数据库吗?

时间:2014-02-17 01:35:06

标签: ruby-on-rails arel

请考虑以下事项:

  • budget在其object中有许多another_collection个。
  • obj在其object中有许多与another_collection相同类型的对象。
  • 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中的任何项目。由于此集合尚未保存到数据库中,因此结果中不会显示这些项目。 / p>

是否有一项功能或其他内容可以传递给Arel的where方法,该方法使用本地结果?我知道我可以迭代这些项目并找到它但是如果我不必这样做并且只是使用已经执行此操作的方法那将会很棒。

1 个答案:

答案 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更适合进行这些比较。但是如果你的记录还没有保存,你需要做类似上面的事情,因为记录还没有保留