Рельсы найти с блоком

Я видел, как метод Rails find принимает блок как

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

Что похоже на Consumer.find (3).

В каких случаях мы можем использовать блок для find?

7 голосов | спросил rshetty 21 52014vEurope/Moscow11bEurope/MoscowFri, 21 Nov 2014 08:58:26 +0300 2014, 08:58:26

2 ответа


0

Это ярлык для .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 в массиве.

Другими словами, он позволяет использовать Enumerable#find для ActiveRecord::Relation. Это может быть полезно, если ваше условие не может быть выражено или оценено в SQL, например запрос сериализованных атрибутов :

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

Чтобы избежать путаницы, я бы предпочел более явную версию:

Consumer.all.to_a.find { |c| c.preferences[:foo] == :bar }
ответил Stefan 21 52014vEurope/Moscow11bEurope/MoscowFri, 21 Nov 2014 10:48:33 +0300 2014, 10:48:33
0

Результат может быть похожим, но запрос SQL не похож на Consumer.find(3)

Он выбирает всех потребителей и затем фильтрует на основе блока. Я не могу вспомнить случай использования, где это может быть полезно

Вот пример запроса в консоли

 consumer = Consumer.find {|c|c.id == 2}
 # Consumer Load (0.3ms)  SELECT `consumers`.* FROM `consumers`
 # => #<Consumer id: 2, name: "xyz", ..>
ответил Santhosh 21 52014vEurope/Moscow11bEurope/MoscowFri, 21 Nov 2014 09:39:21 +0300 2014, 09:39:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132