#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):
- Добавьте область видимости в
Team
модель, которая выбирает объекты, имеющие не менее 15action_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
- Добавьте область видимости в
Company
модель, которая выбирает объекты, с которыми связан хотя бы одинemployee
:class Company # company.employees.size > 0 scope :with_employees, -> { joins(:employees) } end
- Наконец, используйте эти области в
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
но вместо этого просто попробуйте следовать идее, и вы поймете это 🙂