У меня есть четыре модели: User
, Product
, Purchase
и WatchedProduct
.Rails Регистрация на основе нескольких моделей
Я пытаюсь получить список продуктов, которые отвечают одному из следующих критериев:
- Я создал продукт.
- Я купил продукт.
- Продукт является бесплатным, и я «снял» или «просмотрел» его.
Это то, что я до сих пор:
class User < ActiveRecord::Base
...
def special_products
product_ids = []
# products I created
my_products = Product.where(:user_id => self.id).pluck(:id)
# products I purchased
my_purchases = Purchase.where(:buyer_id => self.id).pluck(:product_id)
# free products I watched
my_watched = WatchedProduct.where(:user_id =>self.id).joins(:product).where(products: { price: 0 }).pluck(:product_id)
product_ids.append(my_products)
product_ids.append(my_purchases)
product_ids.append(my_watched)
product_ids # yields something like this => [[1, 2], [], [2]]
# i guess at this point i'd reduce the ids, then look them up again...
product_ids.flatten!
product_ids & product_ids
products = []
product_ids.each do |id|
products.append(Product.find(id))
end
products
end
end
То, что я пытаюсь сделать, это получить список Product
моделей, а не список идентификаторов или список ActiveRecord отношений. Я очень новичок в объединении, но есть ли способ сделать все это в одном соединении вместо трех запросов, уменьшения и повторного поиска?
'buyer_id' принадлежит к Модель покупки. Должен ли я просто переместить третий вариант этой модели? – Jeff
o да, это моя ошибка, я исправлю свой ответ –
Это просто, чтобы упростить запрос, если он не работает, то единственной частью, которая нуждается в исправлении, является 'Product.joins (: watched_products)', какова связь между ' продукт' и 'watched_products'? –