Сравнение записей для поиска улучшений - PullRequest
1 голос
/ 29 мая 2020

У меня есть 2 модели Rails Client и HealthProfile:

class Client < ApplicationRecord
    has_many :health_profiles
end

class HealthProfile < ApplicationRecord
    belongs_to :client, optional: true
    scope :start, -> { where(status: 'start' ) }
    scope :end, -> { where(status: 'end' ) }
end

HealthProfile содержит такую ​​информацию, как :panic_attacks (есть 25 других условий), и я хочу посмотреть, какой процент клиенты показывают улучшение. Чтобы показать улучшение, они должны иметь panic_attacks: true в своих :start health_profile и panic_attacks: false в :end health_profile. Проблема в том, что :panic_attacks по умолчанию имеет значение false.

Есть ли запрос, который я могу выполнить, чтобы захватить все clients, которые ответили true на :panic_attacks в своих :start и false на :panic_attacks в их :end? В идеале это решение будет работать для всех 25 условий.

1 Ответ

0 голосов
/ 29 мая 2020

Вместо этого вы хотите создать ассоциацию «многие ко многим» и запросить ее:

class HealthProfile < ApplicationRecord
  belongs_to :client, optional: true
  has_many :panic_attacks
end
class PanicAttack
  belongs_to :health_profile
end

Это позволит вам, например, подсчитать количество атак с помощью группировки:

profile = HealthProfile.find(1)
# this is postgres specific - use the group_date gem if you need something polyglot
per_month = profile.panic_attacks
                   .group("date_trunc('month', panic_attacks.started_at)") 
                   .count

И вы также можете использовать другие виды агрегатных функций, такие как средние значения и средства для получения значимой статистики. Например, улучшение может заключаться в уменьшении количества или средней длины.

Логические столбцы - это беда.

...