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` # => #