Область действия с условиями, основанными на связанных моделях

#sql #ruby-on-rails #ruby #postgresql #scope

#sql #ruby-on-rails #ruby #postgresql #область видимости

Вопрос:

Я пытаюсь написать область с несколькими условиями в моем приложении Rails 4.

 class Receipt
  # Scope to only get Receipt objects that need to be sent out.
  def self.needs_send_receipts
    where(sent_receipt: false) amp;amp; company.employees.size > 0 amp;amp; company.teams.first.action_items.size >= 15
  end
end
 

Это не работает, и я пытаюсь выяснить, почему, должен ли он оценивать значение true и возвращать информацию.

Комментарии:

1. это company.teams.first.action_items.size сумасшедшая цепочка ассоциаций 🙂

2. дайте мне знать, помог ли мой ответ (если вы пробовали)

Ответ №1:

Вот что я придумал (предупреждение: интенсивное использование scope s):

  1. Добавьте область видимости в Team модель, которая выбирает объекты, имеющие не менее 15 action_items , и ограничивает количество до 1:
     class Team
      # company.teams.first.action_items.size >= 15
      scope :some_action_items, lambda {
        joins(:action_items)
         .group('teams.id')
         .having('COUNT(action_items.id >= 15').limit(1)
      }
    end
     
  2. Добавьте область видимости в Company модель, которая выбирает объекты, с которыми связан хотя бы один employee :
     class Company
      # company.employees.size > 0
      scope :with_employees, -> { joins(:employees) }
    end
     
  3. Наконец, используйте эти области в Receipt своей модели, чтобы запросить receipts учет всех вышеуказанных условий с помощью областей merge ing:
     class Receipt
      # where(sent_receipt: false)
      scope :receipt_not_sent, -> { where(sent_receipt: false) }
    
      # Scope to only get Receipt objects that need to be sent out
      scope :needs_send_receipts, lambda {
        receipt_not_sent
          .joins(company: [:employees, teams: :action_items])
          .merge(Company.with_employees)
          .merge(Team.some_action_items)
      }
    end
     

Надеюсь, вы понимаете, что у меня не было ни малейшего шанса протестировать его, поэтому в случае каких-либо опечаток / ошибок / etc не прибегайте к комментариям

У меня ошибка, в которой говорится you have mistyped a single letter , что ваше решение не работает atata

но вместо этого просто попробуйте следовать идее, и вы поймете это 🙂