2014-02-17 17 views
0

考虑以下几点:Rails和Arel的功能:我可以调用对象而不是调用数据库吗?

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

-

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方法,说使用本地结果只有?我知道我可以迭代这些项目并找到它,但如果我不必这样做,并且只使用一种方法就可以了。

+0

不,您不能,而且这是预期的行为。您正在构建针对数据库运行的查询。除了查询数据库并从那里返回结果之外,为什么还会执行其他任何操作? –

+0

我从来没有说过这是一个错误,我在这里的假设是它**是预期的行为。我问Arel是否支持我正在做的事情,如果没有,在rails框架中有没有一种方法可以完成我所要求的功能。 – DJTripleThreat

+0

你有点早些时候自己回答你的问题。如果您想从未保存的集合中找到内容,则需要根据您的条件迭代和过滤该集合。你不能用Arel查询它。 –

回答

1

您始终可以使用Enumeable#select,该块取一个块并仅返回块返回true的元素。你要确保你有ActiveRecord首先检索结果集(通过在你的查询中调用to_a)。

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

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

+0

完美!这是我一直在寻找的,谢谢! – DJTripleThreat

相关问题