Rails找到一个块

我已经看到Rails find方法采用块作为

 Consumer.find do |c| c.id == 3 end 

这与Consumer.find(3)类似。

我们可以实际使用块进行find一些用例有哪些?

它是.to_a.find { ... }的捷径。 这是方法的源代码 :

 def find(*args) if block_given? to_a.find(*args) { |*block_args| yield(*block_args) } else find_with_ids(*args) end end 

如果传递一个块,它会调用.to_a (加载所有记录)并在数组上调用Enumerable#find .to_a

换句话说,它允许您在ActiveRecord::Relation上使用Enumerable#find ActiveRecord::Relation 。 如果无法在SQL中表达或评估您的条件,例如查询序列化属性 ,这将非常有用:

 Consumer.find { |c| c.preferences[:foo] == :bar } 

为了避免混淆,我更喜欢更明确的版本:

 Consumer.all.to_a.find { |c| c.preferences[:foo] == :bar } 

结果可能类似,但SQL查询与Consumer.find(3)不相似

它取出所有消费者,然后根据块进行过滤。 我不能想到一个可能有用的用例

以下是控制台中的示例查询

  consumer = Consumer.find {|c|c.id == 2} # Consumer Load (0.3ms) SELECT `consumers`.* FROM `consumers` # => #