Вероятно, лучше оставить SQL, чтобы вы обрабатывали всю ситуацию, когда вы хотите найти купленные и не купленные предметы, например,
purchase_table = Purchase.arel_table
selected_items_table = SelectedItems.arel_table
SelectedItems.joins(:sub_categories).joins(
purchase_table.join(selected_items_table,Arel::Nodes::OuterJoin).on(
selected_items_table[:id].eq(purchase_table[:selected_item_id]).and(
purchase_table[:customer_id].eq(customer.id))
).join_sources)
.where(sub_categories: {category_id: @category.id}).select(
"selected_items.*,
Case
WHEN purchases.id IS NULL Then 'Not Purchased'
ELSE 'Purchased'
END AS purchasing_status"
)
Это должно привести к следующему:
SELECT
selected_items.*,
Case
WHEN purchases.id IS NULL Then 'Not Purchased'
ELSE 'Purchased'
END AS purchasing_status
FROM
selected_items
INNER JOIN sub_categories ON sub_categories.selected_item_id = selected_items.id
LEFT OUTER JOIN purchases ON purchases.selected_item_id = selected_items.id
AND purchases.customer_id = [YOU CUSTOMER ID]
WHERE
sub_categories.category_id = [YOUR CATEGORY ID]
Однако это чрезвычайно странная схема, поскольку я предположил бы, что Заказчик сделает выбор, который в конечном итоге может быть приобретен, и что этот выбор будет принадлежать подкатегории.например,
class Customer
has_many :selected_items
has_many :purchases, through: :selected_items
class Purchase
belongs_to :selected_item
class SelectedItem
belongs_to :customer
belongs_to :sub_category
has_one :purchase
class SubCategory
belongs_to :category
has_many :selected_items
class Category
has_many :sub_categories
has_many :selected_items, through: :sub_categories
В этой схеме было бы намного легче определить, был ли SelectedItem
для Customer
Purchase
d или нет