Есть ли более чистый способ вернуть результат массива из метода Rails ActiveRecord? - PullRequest
0 голосов
/ 01 ноября 2018

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

  def self.terms_qualifying
    qualifying_client = []
    Client.all.each do |client|
      qualifying_client << client if client.is_terms_eligible?
    end
    qualifying_client
  end

Я знаю, что могу немного почистить это:

  def self.terms_qualifying
    qualifying_client = []
    return Client.all.each do |client|
      qualifying_client << client if client.is_terms_eligible?
    end
  end

Но я чувствую, что либо неправильно понимаю ключевую концепцию, либо просто не понимаю ее. Могу ли я сделать это более эффективным?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Является ли is_terms_elitable свойство, сохраняемое в базе данных как логическое значение? В этом случае можно было бы сделать что-то вроде этого:

Client.where(is_terms_eligible: true)

Это было бы намного эффективнее.

0 голосов
/ 01 ноября 2018

Вместо того, чтобы создавать массив самостоятельно, вы можете просто перебрать все ваши клиенты и выбрать те, которые вас интересуют, с помощью Array # select

def self.terms_qualifying
  Client.select(&:is_terms_eligible?)
end

Хотя если ваш метод is_terms_eligible? можно переместить в запрос SQL, он может сделать все еще быстрее.

Если вы все еще хотите написать свой цикл более понятным способом, это будет эквивалентно приведенному выше выбору:

Client.all.each_with_object([]) do |client, array|
  array << client if client.is_terms_eligible?
end

as Enumerable # each_with_object возвращает объект, который вы создали внутри блока.

...