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)
结果可能类似,但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)
| 归档时间: |
|
| 查看次数: |
5333 次 |
| 最近记录: |