Order
has_many
Items
- это отношение.
Допустим, у меня есть что-то вроде следующих 2 заказов с элементами в базе данных:
Order1 {email: alpha@example.com, items_attributes:
[{name: "apple"},
{name: "peach"}]
}
Order2 {email: beta@example.com, items_attributes:
[{name: "apple"},
{name: "apple"}]
}
Я выполняю запросы для заказа на основе дочерних атрибутов. Допустим, я хочу получать электронные письма от всех заказов, где у них есть Предмет, который является яблоком. Если я настрою запрос так:
orders = Order.joins(:items).where(items: {name:"apple"})
Тогда результат, потому что он тянет на уровне Item
, будет таким, что:
orders.count = 3
orders.pluck(:email) = ["alpha@exmaple.com", "beta@example.com", "beta@example.com"]
Но мой желаемый результат на самом деле - узнать, какие есть уникальные ордера (мне все равно, что у beta@example.com
есть 2 яблока, только у них есть хотя бы 1), так что-то вроде:
orders.count = 2
orders.pluck(:email) = ["alpha@exmaple.com", "beta@example.com"]
Как мне это сделать?
Если я сделаю orders.select(:id).distinct
, это решит проблему так, что orders.count == 2
, НО это искажает результат (больше не создает объекты AR), так что я не могу перебрать его. Так что ниже все в порядке
deduped_orders = orders.select(:id).distinct
deduped_orders.count = 2
deduped_orders.pluck(:email) = ["alpha@exmaple.com", "beta@example.com"]
Но тогда НЕ работает:
deduped_orders.each do |o|
puts o.email # ActiveModel::MissingAttributeError: missing attribute: email
end
Как будто я в основном хочу вывод orders
, но уникальным способом.