Rails找到一个块

rsh*_*tty 7 ruby ruby-on-rails rails-activerecord

我已经看到Rails find方法占用了块

Consumer.find do |c|
  c.id == 3
end
Run Code Online (Sandbox Code Playgroud)

这与Consumer.find(3)类似.

我们可以实际使用块的一些用例是find什么?

Ste*_*fan 13

这是一条捷径.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
Run Code Online (Sandbox Code Playgroud)

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

换句话说,它可以让你使用Enumerable#find一个ActiveRecord::Relation.如果无法在SQL中表达或评估条件,例如查询序列化属性,这将非常有用:

Consumer.find { |c| c.preferences[:foo] == :bar }
Run Code Online (Sandbox Code Playgroud)

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

Consumer.all.to_a.find { |c| c.preferences[:foo] == :bar }
Run Code Online (Sandbox Code Playgroud)


San*_*osh 5

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

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

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

 consumer = Consumer.find {|c|c.id == 2}
 # Consumer Load (0.3ms)  SELECT `consumers`.* FROM `consumers`
 # => #<Consumer id: 2, name: "xyz", ..>
Run Code Online (Sandbox Code Playgroud)