Rails запись, где хотя бы одна связь со значением атрибута - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть модель Purchase, которая has_many products.Я хочу получить все purchases, в которых есть хотя бы один product, за который полностью оплачено.

Product имеет status, где status 4 означает, что он полностью оплачен.

Я попытался определить область действия в модели Purchase:

scope :full_paid, -> {
  joins(:products).where(products: { status: 4 })
}

Но это приводит только к покупкам, за которые полностью оплачены все существующие products.Могу ли я вместо этого снять все покупки, в которых есть хотя бы 1 полностью оплаченный продукт?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Есть несколько способов сделать это:

1) Использовать left_outer_joins с количеством, указанным ниже:

scope :full_paid, -> {
  left_outer_joins(:products)
      .select("purchase_id, COUNT(CASE WHEN products.status= 4 THEN 1 ELSE 0 END) as paid")
      .having("paid > 0")
      .group("products.purchase_id")
}

2) Аналогично @ John Skiles Skinner ответьте, но с некоторыми изменениями, добавьте группу , чтобы получить уникальные покупки со стороны БД :

Product.select(:purchase_id).where(status: 4).group(:purchase_id)

Я думаю, что может бытьа также другие способы

0 голосов
/ 13 сентября 2018

Я думаю, что это будет сделано, хотя я не уверен, что это лучший способ:

Product.where(status: 4).map{|prod| prod.purchase}.uniq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...